django迁移中的顺序

nob*_*be4 7 python django dependencies database-migration

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

迁移顺序如下:

contenttypes 0001 
contenttypes 0002

auth         0001
...
auth         0006

main_app     0001
...
main_app     0045
Run Code Online (Sandbox Code Playgroud)

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

contenttypes 0001
auth         0001
main_app     0001
...
main_app     0045
contenttypes 0002
auth         0002
...
auth         0006
new_app      0001
Run Code Online (Sandbox Code Playgroud)

有几点值得注意:

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

    auth.0006
    main_app.0045
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  3. my_app.0012udpate user.username字段的长度为255(通过一些AlterField衍生类)

因此,由于运行迁移的顺序,如果没有new_app,则生成的user.username长度为30而不是255.

在初始my_app迁移中,我们具有以下依赖关系:

migrations.swappable_dependency(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

(当您更改默认的django用户模型时似乎需要).

问题是: 为什么迁移的顺序会发生变化?怎么预防呢?

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

migrations.swappable_dependency(settings.AUTH_USER_MODEL),
auth.0006
Run Code Online (Sandbox Code Playgroud)

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

knb*_*nbk 7

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

如果您需要一个接一个地运行迁移,则添加依赖项是正确的解决方案.迁移的设计使您可以在自动生成的迁移不符合您的需求时自行编写.文档涵盖了如何控制迁移的顺序.