Django 2.0:sqlite IntegrityError:FOREIGN KEY约束失败

nny*_*yby 6 python sqlite django foreign-keys django-2.0

我正在努力为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
Run Code Online (Sandbox Code Playgroud)

这在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

Yur*_*rts 9

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

不正确的代码:

class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    column = models.ForeignKey(Column, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

解决方案:

class Column(models.Model):
    ...

class ColumnToDepartment(models.Model):
    referring_column = models.ForeignKey(Column, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)


dir*_*ten 6

文档说两件事:

  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?
    
    Run Code Online (Sandbox Code Playgroud)

    由于PageBlock必须有一个ForeignKey约束错误,这肯定会失败section,因此如果create没有先分配它就无法调用.

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