【问题标题】:Django migration fails to remove fieldDjango 迁移无法删除字段
【发布时间】:2020-07-27 21:35:30
【问题描述】:

我正在使用 Python 3.8.4、Django 2.2.3、SQLite 3.32.3。

当我运行python manage.py makemigrations 时,Django 会创建一个迁移文件,其中包含以下操作,以及其他成功执行的操作。

migrations.RemoveField(
    model_name='essayrequirement',
    name='program',
),

program字段在被移除前的声明如下:

program = models.ForeignKey(UndergraduateProgram, on_delete=models.CASCADE, related_name="essay_set", null=True, blank=True)

但是,当我尝试运行迁移 (python manage.py migrate) 时,我收到错误 django.core.exceptions.FieldDoesNotExist: NewEssayRequirement has no field named 'program'。 (貌似NewEssayRequirement是在应用迁移过程中创建的临时表,应该在迁移完成之前替换掉EssayRequirement表。)

在应用迁移之前查看 SQLite 数据库本身,确认program 字段确实存在——它的列存在。此外,我尝试从迁移中删除此操作,当然下次调用makemigrations 会将其恢复。在这种情况下migrateing 也会出现同样的错误。

有趣的是,在同一模型上还有另一个名为 non_undergrad_program 的字段,不同之处仅在于 ForeignKey 指向的位置。有问题的迁移也删除了此字段,但由于某种原因成功地删除了:

migrations.RemoveField(
    model_name='essayrequirement',
    name='non_undergrad_program',
),

我已经在这个问题上停留了一段时间,因为它或多或少地破坏了我们应用程序向前推进的迁移。我什至找不到忽略该操作的方法,并继续忽略该列的存在。

【问题讨论】:

  • 请展示创建迁移前后的模型,完整的迁移文件,以及错误的完整回溯
  • @Alasdair 我在这样做的过程中发现了我的问题......哎呀。问题已解决

标签: python django django-migrations


【解决方案1】:

原来这是由于我删除的字段的唯一性约束,我忽略了:

class Meta:
    constraints = [
        models.UniqueConstraint(fields=['program', 'index'], name='unique_essay')
    ]

此约束是FieldDoesNotExist 异常的来源。通过调整约束列表并重新进行迁移,然后将这些生成的操作添加到有问题的迁移文件中,该问题已得到解决。

【讨论】:

    猜你喜欢
    • 2023-01-27
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多