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
有几点值得注意:
new_app.0001
迁移具有依赖项(按此顺序):
auth.0006
main_app.0045
并且只为用户创建一个外键。
auth.0004
迁移更新用户名最大长度为 30
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 介绍了如何控制迁移顺序。
我们正在开发一个网络应用程序,它有一个中央应用程序,以及我们最后添加的一个新应用程序。
迁移顺序如下:
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
有几点值得注意:
new_app.0001
迁移具有依赖项(按此顺序):auth.0006 main_app.0045
并且只为用户创建一个外键。
auth.0004
迁移更新用户名最大长度为 30my_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 介绍了如何控制迁移顺序。