【发布时间】: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