Django-pagetree ライブラリにDjango 2.0サポートを追加しています。自動テスト中、sqliteを使用してインメモリデータベースでは、次のようなエラーが大量に発生しています。
File "/home/nnyby/src/Django-pagetree/pagetree/tests/test_models.py", line 638, in setUp
'children': [],
File "/home/nnyby/src/Django-pagetree/pagetree/models.py", line 586, in add_child_section_from_dict
...
File "/home/nnyby/src/Django-pagetree/venv/lib/python3.5/site-packages/Django/db/backends/base/base.py", line 239, in _commit
return self.connection.commit()
Django.db.utils.IntegrityError: FOREIGN KEY constraint failed
これについては、Django 2.0リリースノート: https://docs.djangoproject.com/en/2.0/releases/2.0/#foreign-key -constraints-are-now-enabled-on-sqlite
私が完全に理解していないその説明から、これは永続的ではないテストデータベースには適用すべきではありませんか? Django 2.0を使用している場合、適切なオプションでsqliteテストデータベースが作成されませんか?
テストに使用しているアプリの設定は次のとおりです: https://github.com/ccnmtl/Django-pagetree/blob/master/runtests.py
ドキュメントには2つのことが記載されています。
ForeignKey制約がある場合、それらはデータベースレベルで適用されます。したがって、外部キー制約に違反していないことを確認してください。それが問題の原因である可能性が最も高いですが、それは他のデータベースでこれらの問題を見たことがあることを意味します。コードで次のようなパターンを探します。
# in pagetree/models.py, line 810
@classmethod
def create_from_dict(cls, d):
return cls.objects.create() # what happens to d by the way?
PageBlock
にはsection
が必要なので、ForeignKey制約エラーでこれは間違いなく失敗します。したがって、最初に割り当てることなくcreate
を呼び出すことはできません。
アトミックトランザクション(たとえば)を実行して外部キーの制約を回避し、外部キーのコミットを延期する場合は、外部キーを最初に遅延させる必要があります。実際、毎回再構築されるので、テストデータベースには既にそれがあるはずです。
同じエラーで少し異なる状況に遭遇しました。問題は、同じモデル名とフィールド名を使用することでした
間違ったコード
class Column(models.Model):
...
class ColumnToDepartment(models.Model):
column = models.ForeignKey(Column, on_delete=models.CASCADE)
解決策
class Column(models.Model):
...
class ColumnToDepartment(models.Model):
col = models.ForeignKey(Column, on_delete=models.CASCADE)
外部キーにon_deleteを追加していますか? On Django 2.0この引数は必須です。以下も参照できます。 https://docs.djangoproject.com/en/2.0/ref/models/fields/#Django.db .models.ForeignKey.on_deletehttps://docs.djangoproject.com/en/2.0/howto/upgrade-version/https://docs.djangoproject.com/ en/2.0/topics/db/examples/many_to_one /https://docs.djangoproject.com/en/2.0/ref/models/fields/#Django.db.models.ForeignKey
私はちょうどこのエラーがありました:sqlite3.IntegrityError: FOREIGN KEY constraint failed
on my Django= project。行のどこかにある移行フォルダを削除したので、実行時にモデルの変更が反映されませんでしたpython manage.py makemigrations
。移行が入った移行フォルダがまだあることを確認してください。