我正在开发一个 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
之前被删除。
有没有办法指定跨应用程序迁移文件的顺序? 或者,有没有办法将一个迁移文件添加为另一个迁移文件的依赖项?
这个问题有什么解决办法吗?
或者,有没有办法将一个迁移文件添加为另一个迁移文件的依赖项?
是的。只要 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 自动创建此依赖关系。
依赖属性中列出的所有迁移都必须先完成才能执行此迁移,并且那些迁移中的所有操作(包括依赖项)也必须完成。这意味着您不仅要注意循环导入,还要注意循环迁移依赖项。