在同一个应用程序中具有多个子类的父类的南迁移

时间:2014-04-18 21:45:16

标签: django django-south

我在迁移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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

它说它已经存在,因为该表已经存在。听起来你在过去的某个时刻弄乱了你的迁移,但不要担心!每个人都会这样做。

您可以选择两条路线。如果一个失败,你仍然可以做另一个,所以我只是按照我尝试的顺序列出它们。两者中更容易(并且可能具有风险,具体取决于项目的规模以及您的距离)是试图伪造迁移。:

./manage.py migrate ChildTwo --fake

它会假装它正确地完成所有操作,但是如果与数据库的实际结构和数据库的伪造结构存在冲突,那么您将不得不手动修复问题。但听起来你在你的项目中并不是很远,所以我会在这里走出去,并说这不会是那么大的交易。这些是您要手动删除的内容:

  1. 您应用中的migrations/文件夹。

  2. 数据库中的<app_name>_childtwo

  3. south_migrationshistory表中与ChildTwo模型对应的所有行。如果你正在使用mysql: DELETE FROM <database name>.south_migrationhistory WHERE app_name ='<app_name>';

  4. 但是,删除与整个应用相对应的所有迁移可能更容易,然后重新开始:     ./manage.py schemamigration app_name --initial

    像任何理智的人一样,我鄙视编写SQL,所以我建议你使用phpmyadmin接口。

    我很快就会停止编辑,但最后一件事,如果你的应用程序不太远,你也可以做./manage.py reset <app_name>并重新开始。您仍然必须摆脱南迁移文件夹和数据库条目