如何在django中跨不同应用程序排序迁移文件?

问题描述 投票:0回答:1

我正在开发一个 Django 项目。一段时间后,我想重构代码。我想创建一个新的应用程序并将我的一些模型移动到该应用程序。这是一个例子:

假设我有一个名为

CategoryApp
的应用程序,其中有两个名为
Product
Category
的模型。

class Category(models.Model):
    ...

class Product(models.Model):
    ...

经过一段时间的编码后,我意识到我需要一个单独的应用程序来实现

Product
。所以,我创建了一个名为
ProductApp
的新应用程序。并将
Product
模型从
CategoryApp
复制到
ProductApp
。我妥善管理了所有外键和关系。

现在,我需要创建迁移文件。

首先,我为应用程序

ProductApp
(
python3 manage.py makemigrations ProductApp
) 创建了一个迁移文件,它只是在数据库中创建了一个新表
productapp_product
。迁移文件名为
0001.py
。我应用了此迁移并创建了一个新表。

其次,我在

ProductApp
python3 manage.py makemigrations ProductApp --empty
)中创建了一个空的迁移文件。迁移文件名为
0002.py
我修改了空迁移文件的内容以运行 SQL 查询,将
categoryapp_product
表中的所有数据复制到
productapp_product
。我还添加了reverse_sql,以防我需要反转迁移。我也应用了此迁移,所有数据都复制到新表中。

第三,我从

Product
中删除了
CategoryApp
模型,并为
CategoryApp
创建了迁移文件。迁移文件名为
0002.py
。我应用了此迁移,旧表现已删除。

我将我的代码推送到了 github。我去了我的 VPS 服务器并提取了最新的代码。我运行了命令

pyrhon3 manage.py migrate
希望一切顺利。

唉,我在迁移

categoryapp_product does not exist
时收到一条错误消息
ProductApp/migrations/0002.py
。 Django 在
CategoryApp/migrations/0002.py
之前迁移了
ProductApp/migrations/0002.py
,这导致
categoryapp_product
表在其数据复制到
productapp_product
之前被删除。

有没有办法指定跨应用程序迁移文件的顺序? 或者,有没有办法将一个迁移文件添加为另一个迁移文件的依赖项?

这个问题有什么解决办法吗?

python django django-migrations
1个回答
0
投票

或者,有没有办法将一个迁移文件添加为另一个迁移文件的依赖项?

是的。只要 Django 的

makemigrations
命令能够检测到一个应用程序依赖于另一个应用程序,它就会自动为您执行此操作,假设它们通过
ForeignKey
或类似的方式相关。

这是一个合法的例子:

# users/migrations/0001_initial.py
class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0012_alter_user_first_name_max_length'),
        ('organization', '0001_initial'),
    ]

如您所见,依赖项列表包含元组,其中元组包含应用程序名称和迁移名称。我的

User
模型向
ForeignKey
应用程序中的模型声明了
Organization
,因此 Django 自动创建此依赖关系。

依赖属性中列出的所有迁移都必须先完成才能执行此迁移,并且那些迁移中的所有操作(包括依赖项)也必须完成。这意味着您不仅要注意循环导入,还要注意循环迁移依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.