13

我正在努力将 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

4

8 回答 8

8

文档说了两件事:

  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 约束错误,因为 a PageBlockmust have section,所以你不能在create没有先分配它的情况下调用。

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

于 2017-12-03T17:21:05.383 回答
4

A 遇到了一些不同的情况,但出现了相同的错误。问题是我使用相同的模型名称和字段名称

不正确的代码

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)
于 2019-05-29T13:59:47.600 回答
1

就我而言,我发现我的模型引用的 ForeignKey 对象不存在。所以我只是将引用的 FK 对象更改为存在对象。

于 2020-06-18T02:33:45.067 回答
0

还有一件事要检查,在我的情况下,它与我的装置文件有关。迁移到 Django3 后重新生成它们解决了我在测试我的应用程序时遇到的问题。

./manage.py dumpdata app.Model1 app.Model2 --indent=4 > ./app/fixtures/file.json
于 2020-01-01T07:24:15.347 回答
0

当我在迁移或表方面遇到问题时,我会这样做,并且通常会有所帮助:

  1. 评论你的问题字符串;
  2. python3 manage.py makemigrationspython3 manage.py migrate;
  3. 那你必须做python3 manage.py migrate --fake
  4. 取消注释您的字符串并再次python3 manage.py makemigrations执行python3 manage.py migrate.

我希望它对你有用

于 2020-04-09T11:32:22.780 回答
0

迁移后我的问题得到了解决,因为我更改了外键然后没有应用迁移。

具体来说,起初我在模型中有以下代码:

class TeacherRequest(models.Model):
    requester = models.ForeignKey(
        Profile,
        on_delete=models.CASCADE,
        related_name="teacher_request",
    )

    class RequestStatus(models.TextChoices):
        PENDING = '1', _('pending')
        APPROVED = '2', _('approved')
        REJECTED = '3', _('rejected')

    status = models.CharField(
        choices=RequestStatus.choices,
        max_length=1,
        default=RequestStatus.PENDING,
    )

然后我将外键从更改ProfileUser


class TeacherRequest(models.Model):
    requester = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="teacher_request",
    )

    class RequestStatus(models.TextChoices):
        PENDING = '1', _('pending')
        APPROVED = '2', _('approved')
        REJECTED = '3', _('rejected')

    status = models.CharField(
        choices=RequestStatus.choices,
        max_length=1,
        default=RequestStatus.PENDING,
    )

解决方案

python manage.py makemigrations
python manage.py migrate
于 2021-01-20T00:07:43.523 回答
0

我刚刚遇到了这个错误:sqlite3.IntegrityError: FOREIGN KEY constraint failed在我的 Django 项目中。原来我在某处删除了迁移文件夹,所以当我运行时它没有接收到我的模型更改python manage.py makemigrations。只要确保您仍然有一个包含迁移的迁移文件夹。

于 2019-07-22T20:49:58.467 回答