Django 2.0:sqlite IntegrityError:外键约束失败

新手上路,请多包涵

我正在努力将 Django 2.0 支持添加到 django-pagetree 库。在自动化测试期间,使用 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

原文由 nnyby 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 930
2 个回答

文档说了两件事:

  1. 如果您有 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?

这肯定会因 ForeignKey 约束错误而失败,因为 PageBlock 必须具有 section ,所以你不能调用 create

  1. 如果您通过执行原子事务(例如)来延迟提交外键来规避外键约束,则您的外键需要初始延迟。实际上,您的测试数据库应该已经有了,因为它每次都会重建。

原文由 dirkgroten 发布,翻译遵循 CC BY-SA 3.0 许可协议

我遇到了同样错误的不同情况。问题是我使用了相同的模型名称和字段名称

不正确的代码:

 class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    column = models.ForeignKey(Column, on_delete=models.CASCADE)

解决方案:

 class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    referring_column = models.ForeignKey(Column, on_delete=models.CASCADE)

原文由 Yuriy Gyerts 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题