2011-09-19 35 views
8

我最近开始在我的Django项目中使用South进行迁移。直到最近,当我遇到一个奇怪的问题时,一切进展顺利。South在不同的应用程序中遵循什么迁移顺序?

我在我的项目中有两个应用程序,比如App-A和App-B。 App-A中的模型具有App-B中模型的外键。当我尝试构建我的系统时,我运行了syndb,它创建了所有auth_south_表。然后我跑了migrate这引发了错误。当它试图从引用App-B模型的App-A创建模型时,模型App-B尚未迁移/创建,因此也是错误。

为了解决这个问题,我必须先手动迁移App-B,然后再App-A。我在这里做错了什么? South应该如何知道跨应用程序的迁移顺序?

谢谢。

回答

16

这解释了它https://south.readthedocs.io/en/latest/dependencies.html

迁移的应用是很好的“东经所有,但是当你开始写 大的项目,有很多的应用程序,你会意识到你有应用程序,并制定出什么样的顺序迁移会 需求之间的外键 关系为每个应用程序应用是痛苦的。

幸运的是,我们也有这个问题,所以南有一个依赖系统。 在迁移中,您可以声明它依赖于另一个 应用程序首先运行某个迁移;例如,如果我的应用程序 “论坛”依赖于“账户”已经创建的应用程序的用户配置文件 表中,我们可以这样做:

# forum/migrations/0002_post.py class Migration: 

    depends_on = (
     ("accounts", "0003_add_user_profile"), 
    ) 

    def forwards(self): 

然后,如果你试图迁移到或超过0002_post在论坛应用程序,它首先会确保帐户至少迁移到 直到0003_add_user_profile,如果不是,将会为您迁移它。

依存关系也可以反向工作; South知道不会撤消该0003_add_user_profile迁移,直到它已撤消迁移0002_post 。

你可以有多个依赖和各种古怪的结构; 有,但是,两个规则:

没有循环依赖(取决于每个 其他两个或两个以上的迁移)在相同的应用程序不依赖向上(所以你不能让 0002_post在论坛上的应用程序依赖于0003_room在相同的应用程序,直接或通过依赖链或者 。

12

South按照它们出现在settings.py中的INSTALLED_APPS元组中的顺序迁移应用。所以只要确保App-B在你的settings.py中出现在App-A之前,它应该可以工作:)

+0

刚上投这一点,因为这其实是非常重要的。'depends_on'和'needed_by'似乎只控制实际的迁移。如果你刚开始迁移时,就像我的情况一样,South将在迁移完成后尝试加载应用程序的初始数据。我遇到了应用程序的初始da在另一个人需要它并遇到外键问题之前,它们并不可用。我可以通过重新订购INSTALLED_APPS中的应用程序来解决此问题。South运行应用程序的顺序是它们在'INSTALLED_APPS'中暂停运行任何迁移依赖关系。 – jaywhy13

相关问题