1. ホーム
  2. python

TypeError: __init__() missing 1 required positional argument: 'on_delete' Solution

2022-02-18 17:44:11
<パス

Django で Model を作成すると、次のようなエラーが発生します。

TypeError: イニット () 1つの必須位置引数がありません: 'on_delete'

コードは次のようになります。

from django.db import models

# Create your models here.
class Contract(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=120)
    DecimalField(max_digits=9, decimal_places=2, default=0)

class Project(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=120)
    DecimalField(max_digits=9, decimal_places=2, default=0)

    # Create a one-to-many relationship with Contract
    contract = models.ForeignKey(Contract)


pythonを実行する場合 manage.py makemigrationsでエラーが発生しました。TypeError: init () 1つの必須位置引数がありません: 'on_delete'

解決策

外部キーを定義する際に、on_delete=を追加する必要があります。
ということです。

contract = models.ForeignKey(Contract, on_delete=models.CASCADE)

その理由は以下の通りです。

django が 2.0 にアップグレードした後、テーブル同士を関連付ける場合、 on_delete パラメータを記述しなければならず、そうしないと例外が報告されます。
TypeError: init() missing 1 required positional argument: 'on_delete'.

on_deleteの各引数の意味は以下の通りです。

	on_delete=None, # the behavior of the current table and its associated field when deleting data from the associated table
	on_delete=models.CASCADE, # Deletes the associated data, and the associated field is also deleted
	on_delete=models.DO_NOTHING, # Delete the associated data and do nothing
	on_delete=models.PROTECT, # Delete the associated data, raising the error ProtectedError
	# models.ForeignKey('associated table', on_delete=models.SET_NULL, blank=True, null=True)
	SET_NULL, # delete the associated data, the value associated with it is set to null (the premise that the FK field needs to be set to null, the same for one-to-one)
	# models.ForeignKey('associated table', on_delete=models.SET_DEFAULT, default='default')
	on_delete=models.SET_DEFAULT, # delete the associated data, the value associated with it is set to the default value (provided the FK field needs to be set to the default value, the same for one-to-one)
	on_delete=models,
	 a. The value associated with it is set to the specified value, set: models.SET(value)
	 b. The value associated with it is set to the return value of the executable object, set: models.SET(executable)



ManyToManyField には on_delete パラメータがないので、上記は ForeignKey と OneToOneField のみになります。

以上、以下の記事の著者の方々に感謝しつつ、学習過程で遭遇した問題を記録してみました。

<ブロッククオート

https://www.cnblogs.com/phyger/p/8035253.html
https://blog.csdn.net/buxianghejiu/article/details/79086011

お気軽に添削していただき、一緒に勉強しましょう :)