私の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'
次のようにクラス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,
# ...
Django 2.x以降、on_delete
が必要です。
バージョン1.9以降廃止予定:on_deleteはDjango 2.0では必須の引数になります。古いバージョンではデフォルトでCASCADEになっています。
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
Django 2.0からはon_delete
が必要です:
user = models.OneToOneField(ユーザー、on_delete = models.CASCADE)
ユーザーが削除されると、子テーブルのデータも削除されます。詳しくはDjangoのドキュメントを確認してください。
Foreignkeyを使用している場合は、親テーブルから元の要素を削除した後に生じる複雑さを排除するために "on_delete = models.CASCADE"を使用する必要があります。それと同じくらい簡単です。
categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE)
On_deleteのために誰かに役立つならば、利用可能なオプションはここにあります
CASCADE、DO_NOTHING、PROTECT、SET、SET_DEFAULT、SET_NULL
Django 2.0以降、ForeignKeyフィールドには2つの位置引数が必要です。
categorie = models.ForeignKey('Categorie', on_delete=models.PROTECT)
これがon_deleteで使えるいくつかの方法です。
カスケード削除DjangoはSQL制約ON DELETE CASCADEの振る舞いをエミュレートし、ForeignKeyを含むオブジェクトも削除します
Django.db.IntegrityErrorのサブクラスであるProtectedErrorを送出することで、参照されたオブジェクトの削除を防ぎます。
何もするな。データベースバックエンドが参照整合性を強制する場合、手動でデータベースフィールドにSQL ON DELETE制約を追加しない限り、これはIntegrityErrorを引き起こします。
ドキュメント を読むことでon_deleteについてもっと知ることができます。
これは私のために働きましたpip install Django-csvimport --upgrade