我最近开始在我的Django项目中使用South进行迁移。直到最近,当我遇到一个特殊问题时,一切进展顺利。
我的项目中有两个应用程序,比如App-A和App-B。 App-A中的模型具有App-B中模型的外键。当我一直在尝试构建我的系统时,我运行了syndb
,它创建了所有auth_
和south_
表。然后我跑了migrate
,这引起了错误。当它尝试从App-A创建模型时,App-A引用了App-B中的模型,模型App-B尚未迁移/创建,因此也就是错误。
为了解决这个问题,我必须首先手动迁移App-B,然后再手动迁移App-A。我在这里做错了吗? South如何知道跨应用程序的迁移顺序?
感谢。
答案 0 :(得分: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或超出0002_post,它将首先确保至少迁移帐户 最多为0003_add_user_profile,如果没有,将为您迁移它。
依赖性也相反;南方知道不要撤消这一点 0003_add_user_profile迁移,直到撤消0002_post 迁移。
你可以有多个依赖关系,以及各种古怪的结构; 但是,有两条规则:
没有循环依赖关系(两次或多次迁移取决于每个 其他)在同一个应用程序中没有向上依赖(所以你不能做 论坛应用中的0002_post依赖于同一应用中的0003_room 直接或通过依赖链。
答案 1 :(得分:12)
South会按照它们在settings.py中的INSTALLED_APPS
元组中出现的顺序迁移应用。因此,只需确保App-A在您的settings.py中出现在App-A之前,它应该可以工作:)