我在迁移Django类时遇到问题,该类是两个子类的父类。所有课程都在同一个应用程序中。每当我尝试迁移父类时,South都会抱怨表已经存在。这是我的课程,简化:
class ParentClass(models.Model):
my_field_in_both = models.DateField(null=True, blank=True)
class Meta():
abstract = True
两个子课程:
class ChildOne(ParentClass, AnotherMixin):
child_field = models.DateField(null=True, blank=True)
class ChildTwo(ParentClass, YetAnotherMixin):
another_child_field = models.DateField(null=True, blank=True)
现在,我可以迁移AnotherMixin或YetAnotherMixin类没问题。但是在ParentClass上添加一个字段,然后运行:
python manage.py schemeamigration <appname> --auto
生成迁移文件,但随后运行:
python manage.py migrate <appname>
给出:
django.db.utils.DatabaseError: table "_south_new_<appname>_ChildTwo" already exists
我做错了什么?
答案 0 :(得分:0)
它说它已经存在,因为该表已经存在。听起来你在过去的某个时刻弄乱了你的迁移,但不要担心!每个人都会这样做。
您可以选择两条路线。如果一个失败,你仍然可以做另一个,所以我只是按照我尝试的顺序列出它们。两者中更容易(并且可能具有风险,具体取决于项目的规模以及您的距离)是试图伪造迁移。:
./manage.py migrate ChildTwo --fake
它会假装它正确地完成所有操作,但是如果与数据库的实际结构和数据库的伪造结构存在冲突,那么您将不得不手动修复问题。但听起来你在你的项目中并不是很远,所以我会在这里走出去,并说这不会是那么大的交易。这些是您要手动删除的内容:
您应用中的migrations/
文件夹。
数据库中的<app_name>_childtwo
表
south_migrationshistory
表中与ChildTwo模型对应的所有行。如果你正在使用mysql:
DELETE FROM <database name>.south_migrationhistory WHERE app_name ='<app_name>';
但是,删除与整个应用相对应的所有迁移可能更容易,然后重新开始:
./manage.py schemamigration app_name --initial
像任何理智的人一样,我鄙视编写SQL,所以我建议你使用phpmyadmin接口。
我很快就会停止编辑,但最后一件事,如果你的应用程序不太远,你也可以做./manage.py reset <app_name>
并重新开始。您仍然必须摆脱南迁移文件夹和数据库条目