Django:重命名模型,M2M表未被重命名。

3
TLDR: 模型已移至新应用程序。迁移后,M2M关系引用不存在的表。以前的M2M表未被重命名。 Django版本:3.2.3 场景: 我正在重构Django应用程序。在此过程中,我将一些模型移动到了一个新应用程序中。为此,我使用SeparateDatabaseAndState对表进行了重命名,如由Haki Benita描述
新应用程序中的一个模型Students有一个与另一个模型Teachers(我也将其移动到了新应用程序中)具有Many2Many关系的字段。

oldapp/migrations/000X_auto_XXX.py

operations = [
...
 migrations.SeparateDatabaseAndState(
            state_operations=[
                migrations.DeleteModel(
                    name='Students',
                )
            ],
            database_operations=[
                migrations.AlterModelTable(
                    name='Students',
                    table='newapp_students'
                )
            ]
        ),
 migrations.SeparateDatabaseAndState(
            state_operations=[
                migrations.DeleteModel(
                    name='Teachers',
                )
            ],
            database_operations=[
                migrations.AlterModelTable(
                    name='Teachers',
                    table='newapp_Teachers'
                )
            ]
        ),
...
]

newapp/migrations/0001_initial.py

operations = [
...
        migrations.SeparateDatabaseAndState(
            state_operations=[
                migrations.CreateModel(
                    name='Teacher',
                    fields=[...],
                    options={...},
                )
            ],
            database_operations=[]
        ),
        migrations.SeparateDatabaseAndState(
            state_operations=[
                migrations.CreateModel(
                    name='Students',
                    fields=[
                       ...
                       ('teachers', models.ManyToManyField(blank=True,related_name='students', to='newapp.Teachers')),
                       ...
                    ],
                    options={...},
                )
            ],
            database_operations=[]
        ),

       ...
]

在运行python manage.py migrate后,所有的模型都被重命名了(到此为止还不错)。
问题:自动生成的Many2Many表没有被重命名(oldapp_students_teachers)。然而,新应用程序中的模型引用了一个不存在的新应用程序中的表(newapp_students_teachers)。
我做了一些研究,似乎这个问题已经在几年前得到了解决和修复41b337efa085b6b9cfdb2cf724d977005ff77e75
然而,对我来说问题仍然存在。那么我做错了什么?

在调用migrations.AlterModelTable之前,有可能在迁移中删除M2M。如果您首先删除模型,然后运行makemigrations,这种情况会在自动生成的迁移中发生。 - undefined
2个回答

0

我在重命名用户模型时遇到了类似的问题,但是我的m2m表中有一些字段没有随着迁移而更改。我能想到的唯一办法就是编写管理命令来重命名这些字段。所以我认为你也可以用类似的方法解决这个问题。

cursor.execute("ALTER TABLE oldapp_students_teachers RENAME TO newapp_students_teachers;" )

0
对我来说,M2M表已经正确地重命名了...除非它们是使用db_table定义的。这是有道理的,因为否则Django无法假设名称遵循其约定。在我的情况下,我可以通过在删除/重命名操作之前添加AlterField行来从M2M字段定义中删除db_table来解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接