django 迁移中的顺序

Order in django migrations

我们正在开发一个网络应用程序,它有一个中央应用程序,以及我们最后添加的一个新应用程序。

迁移顺序如下:

contenttypes 0001 
contenttypes 0002

auth         0001
...
auth         0006

main_app     0001
...
main_app     0045

添加新应用后,迁移顺序如下:

contenttypes 0001
auth         0001
main_app     0001
...
main_app     0045
contenttypes 0002
auth         0002
...
auth         0006
new_app      0001

有几点值得注意:

  1. new_app.0001 迁移具有依赖项(按此顺序):

    auth.0006
    main_app.0045
    

    并且只为用户创建一个外键。

  2. auth.0004 迁移更新用户名最大长度为 30

  3. my_app.0012 更新 user.username 字段使其长度为 255(通过一些 AlterField-派生的 class)

所以由于迁移的顺序是 运行,没有 new_app,结果 user.username 长度是 30 而不是 255。

在最初的 my_app 迁移中,我们有以下依赖项:

migrations.swappable_dependency(settings.AUTH_USER_MODEL)

(当您更改默认的 django 用户模型时,这似乎是必需的)。

问题是: 为什么迁移的顺序会改变?如何预防?

注意: 我们确实找到了 "hacky" 方法来防止这种情况,通过在 my_app 初始迁移中添加依赖项:

migrations.swappable_dependency(settings.AUTH_USER_MODEL),
auth.0006

但我们认为这不是一个可行的解决方案,因此我们正在寻找更好的解决方案。

Django 尝试通过首先按字母顺序对单个迁移中的所有依赖项进行排序来创建一致的迁移顺序,然后使用深度优先搜索来创建最终的迁移计划。由于迁移计划总是在 运行 时解决,所以偶尔的一次更改可能会对最终的迁移计划产生很大影响。

如果您需要一次又一次迁移到 运行,添加依赖项是正确的解决方案。迁移被设计为如果自动生成的迁移不适合您的需要,您可以自己编写它们。 the docs 介绍了如何控制迁移顺序。