South在不同应用中的迁移顺序是什么?
我最近开始在我的Django项目中使用South来处理数据库迁移。之前一切都很顺利,但最近遇到了一个奇怪的问题。
我的项目里有两个应用,分别叫做App-A和App-B。App-A中的一个模型有一个外键指向App-B中的一个模型。当我尝试构建我的系统时,我运行了syndb
,这会创建所有的auth_
和south_
表。接着我又运行了migrate
,结果出现了错误。当它尝试创建App-A中的模型时,因为这个模型引用了App-B中的一个模型,而App-B还没有被迁移或创建,所以就出错了。
为了解决这个问题,我不得不先手动迁移App-B,然后再迁移App-A。我是不是做错了什么?South应该怎么知道不同应用之间的迁移顺序呢?
谢谢。
2 个回答
South会按照settings.py文件中INSTALLED_APPS
这个元组里应用出现的顺序来迁移应用。所以只要确保App-B在settings.py里排在App-A之前,就可以正常工作了 :)
这段内容解释得很清楚,链接在这里:https://south.readthedocs.io/en/latest/dependencies.html.
对于应用程序来说,迁移功能是很不错的,但当你开始写一个大型项目,里面有很多应用时,你会发现应用之间有外键关系,这样就得搞清楚每个应用的迁移顺序,这真是让人头疼。
幸运的是,我们也遇到过这个问题,所以South有一个依赖系统。在迁移中,你可以声明它依赖于另一个应用先执行某个迁移;比如说,如果我的应用“论坛”依赖于“账户”应用先创建用户资料表,我们可以这样做:
# 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,无论是直接依赖还是通过依赖链)。