Django南循环依赖

时间:2013-07-17 22:40:26

标签: django django-south django-1.5

我在Django 1.5项目中有一个应用程序(我们称之为MyApp)。 MyApp定义了一个自定义用户模型(MyUser)。该项目使用另一个引用MyUser的应用程序(AnotherApp)。 MyApp引用AnotherApp中的字段。

我的开发笔记本电脑上的一切都运行良好。我正在尝试在服务器上部署我的项目,当我进入迁移步骤时,MyApp因为依赖于AnotherApp而失败,而AnotherApp在依赖于MyApp时失败(我尝试独立迁移应用程序)。两者都在各自的第一次迁移失败(0001)

Running migrations for myapp:
 - Migrating forwards to 0017_auto__blah_blah.
 > myapp:0001_initial
FATAL ERROR - The following SQL query failed: ALTER TABLE "myapp_mymodel_othermodel" ADD CONSTRAINT "othermodel_id_refs_id_ae052c6d" FOREIGN KEY ("othermodel_id") REFERENCES "anotherapp_othermodel" ("id") DEFERRABLE INITIALLY DEFERRED;
The error was: relation "anotherapp_othermodel" does not exist

Error in migration: myapp:0001_initial
DatabaseError: relation "anotherapp_othermodel" does not exist


Running migrations for anotherapp:
 - Migrating forwards to 0008_blah_blah.
 > anotherapp:0001_initial
FATAL ERROR - The following SQL query failed: ALTER TABLE "anotherapp_othermodel" ADD CONSTRAINT "creator_id_refs_id_cff6fecf" FOREIGN KEY ("creator_id") REFERENCES "myuser" ("id") DEFERRABLE INITIALLY DEFERRED;
The error was: relation "myuser" does not exist

Error in migration: anotherapp:0001_initial
DatabaseError: relation "myuser" does not exist

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

这里似乎存在真正的循环依赖。但是,您可以非常轻松地将其拆分:将MyApp中m2m表的创建移动到单独的迁移中。最简单的方法可能是将0001_initial.py复制到新名称,然后删除原始中m2m表(前向和后向!)的块,并删除副本中的其他所有内容。

应该对副本进行命名,以便在0001_initial和0002_whatever之间进行排序 - 例如,0001_initial2.py;它应该依赖于(“AnotherApp”,“0001_initial”) - 反过来,它应该依赖于(“MyApp”,“0001_initial”)。