web-dev-qa-db-ja.com

TypeErrorを取得する:エントリを持つ子テーブルの後に親テーブルを追加しようとしたときに必要な位置引数 'on_delete'が1つ欠落している__init __()

私のsqliteデータベースには2つのクラスがあります。Categorieという名前の親テーブルとArticleという名前の子テーブルです。最初に子テーブルクラスを作成し、エントリを追加しました。だから最初に私はこれを持っていました:

class Article(models.Model):
    titre=models.CharField(max_length=100)
    auteur=models.CharField(max_length=42)
    contenu=models.TextField(null=True)
    date=models.DateTimeField(
        auto_now_add=True,
        auto_now=False,
        verbose_name="Date de parution"
    )

    def __str__(self):
        return self.titre

そして私が親テーブルを追加した後、そして今私のmodels.pyはこのようになります:

from Django.db import models

# Create your models here.
class Categorie(models.Model):
    nom = models.CharField(max_length=30)

    def __str__(self):
        return self.nom


class Article(models.Model):
    titre=models.CharField(max_length=100)
    auteur=models.CharField(max_length=42)
    contenu=models.TextField(null=True)
    date=models.DateTimeField(
        auto_now_add=True,
        auto_now=False,
        verbose_name="Date de parution"
    )
    categorie = models.ForeignKey('Categorie')

    def __str__(self):
        return self.titre

だから私はpython manage.py makemigrations <my_app_name>を実行すると、私はこのエラーが出ます:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\Django-2.0-py3.5.Egg\Django\core\management\__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\Django-2.0-py3.5.Egg\Django\core\management\__init__.py", line 330, in execute
    Django.setup()
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\Django-2.0-py3.5.Egg\Django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\Django-2.0-py3.5.Egg\Django\apps\registry.py", line 112, in populate
    app_config.import_models()
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\Django-2.0-py3.5.Egg\Django\apps\config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 665, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "C:\Users\lislis\Django\mon_site\blog\models.py", line 6, in <module>
    class Article(models.Model):
  File "C:\Users\lislis\Django\mon_site\blog\models.py", line 16, in Article
    categorie = models.ForeignKey('Categorie')
TypeError: __init__() missing 1 required positional argument: 'on_delete'

私はスタックオーバーフローで同様の問題をいくつか見ましたが、同じ問題ではないようです: __ init __()に必要な位置引数が1つ欠けています: 'Quantity'

67

次のようにクラスcategorieのプロパティArticleを変更することができます。

categorie = models.ForeignKey(
    'Categorie',
    on_delete=models.CASCADE,
)

そしてエラーは消えます。

最終的にはon_deleteのための別のオプションが必要になるかもしれません、詳細についてはドキュメンテーションをチェックしてください:

https://docs.djangoproject.com/en/1.11/ref/models/fields/#Django.db.models.ForeignKey

編集:

on_deleteに特別な要件はないというあなたのコメントで述べたように、あなたはオプションDO_NOTHINGを使うことができます:

# ...
on_delete=models.DO_NOTHING,
# ...
107
cezar

Django 2.x以降、on_deleteが必要です。

Djangoのドキュメント

バージョン1.9以降廃止予定:on_deleteはDjango 2.0では必須の引数になります。古いバージョンではデフォルトでCASCADEになっています。

31

Django 1.9までは、モデルは次のようになりました。

from Django.db import models
class Article(models.Model):
    category = models.ForeignKey(Category)
    title =  models.CharField(max_length=55)
    # ...

    def __str__(self):
        return self.title

ForeignKey は多対一の関係を定義するためのDjangoフィールドです。

Django 1.9まではForeignKeyフィールドは単一の引数を必要としていました:マップするモデルです。

Django 2.0以降、ForeignKeyフィールドには2つの位置引数が必要です。

1-マップするモデル

2 - on_delete引数

「1つの必須位置引数がありません:on_delete」を素早く修正するためにモデルを更新します。

from Django.db import models
class Article(models.Model):
    category = models.ForeignKey('Category', on_delete=models.PROTECT)
    title =  models.CharField(max_length=55)
    # ...

    def __str__(self):
        return self.title

ForeignKeyを修正すると、問題なくマイグレーションを実行できるようになります。

python manage.py migrate

Valentinoに感謝します

9
Alex Jolig

Django 2.0からはon_deleteが必要です:

user = models.OneToOneField(ユーザー、on_delete = models.CASCADE)

ユーザーが削除されると、子テーブルのデータも削除されます。詳しくはDjangoのドキュメントを確認してください。

7
Javed Gouri

Foreignkeyを使用している場合は、親テーブルから元の要素を削除した後に生じる複雑さを排除するために "on_delete = models.CASCADE"を使用する必要があります。それと同じくらい簡単です。

categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
5
Bala Kiswe

On_deleteのために誰かに役立つならば、利用可能なオプションはここにあります

CASCADE、DO_NOTHING、PROTECT、SET、SET_DEFAULT、SET_NULL

3
Tarun Behal

Django 2.0以降、ForeignKeyフィールドには2つの位置引数が必要です。

  1. マッピング先のモデル
  2. on_delete引数
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)

これがon_deleteで使えるいくつかの方法です。

  1. カスケード

カスケード削除DjangoはSQL制約ON DELETE CASCADEの振る舞いをエミュレートし、ForeignKeyを含むオブジェクトも削除します

  1. 保護

Django.db.IntegrityErrorのサブクラスであるProtectedErrorを送出することで、参照されたオブジェクトの削除を防ぎます。

  1. 何もしない

何もするな。データベースバックエンドが参照整合性を強制する場合、手動でデータベースフィールドにSQL ON DELETE制約を追加しない限り、これはIntegrityErrorを引き起こします。

ドキュメント を読むことでon_deleteについてもっと知ることができます。

2
Thusitha Deepal

これは私のために働きましたpip install Django-csvimport --upgrade

0
Mayank Jaiswal