You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django迁移:SeparateDatabaseAndState与--fake的适用场景辨析

Django移除字段但延迟数据库变更:两种方案的适用场景

假设我们有如下Django模型:

class MyModel(models.Model):
    ...
    field_no_need_anymore = models.CharField(...)

我们希望移除field_no_need_anymore字段,但不立即修改数据库,后续再手动删除对应列。Django提供了两种实现方式,二者都会在django_migrations表中新增记录,但不会修改目标表,它们的适用场景如下:

一、使用python manage.py migrate --fake的场景

  • 适合已经手动完成了数据库结构调整,或者完全不需要Django执行迁移文件里的任何数据库操作的情况。比如你已经提前手动删除了数据库中的目标列,现在需要让Django的迁移状态和实际数据库对齐;或者这个迁移文件里的所有数据库操作你都打算跳过,只需要标记迁移已完成。
  • 注意:这个命令会让Django认为整个迁移的所有操作都已执行完毕。如果迁移文件里还有其他需要实际执行的数据库操作,使用--fake会直接跳过这些操作,可能导致Django的内部状态和实际数据库结构不一致。因此仅当迁移文件中的所有数据库操作都无需执行,或已手动完成时,才适合用此命令。

二、使用migrations.SeparateDatabaseAndState的场景

  • 适合需要精准拆分状态变更与数据库操作的场景。你可以明确指定哪些操作仅修改Django的内部模型状态(比如移除字段),哪些操作实际作用于数据库(这里留空表示不执行任何数据库操作),后续再单独处理数据库列的删除。
  • 这种方式的灵活性和可读性更强:如果迁移文件中还有其他需要执行的数据库操作,也可以和这个分离操作共存,不会被影响;同时迁移文件本身会清晰记录操作意图,后续维护人员查看代码就能明白这个操作仅更新状态、不修改数据库,而--fake是通过命令行参数实现的,没有留在代码记录中,容易造成误解。

内容的提问来源于stack exchange,提问作者Rm1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:12:31