如何阻止Django 1.11为非托管模型生成迁移文件?
解答:Django 1.11.10中
managed=False仍生成表迁移的问题 别担心,这个情况不是Django 1.11.10的版本bug,managed=False的功能在这个版本里是正常工作的,大概率是你的模型配置或者迁移历史有小问题导致的。下面是常见原因和解决办法:
1. 检查Meta类的缩进是否正确
这是最常见的坑!Django要求Meta类必须是模型类的内部类,缩进必须和模型字段保持一致。如果你的Meta类缩进错误(比如和MyModel同级),那managed=False的设置根本不会被Django识别,它会默认使用managed=True,自然会生成创建表的迁移。
正确的写法应该是这样:
class MyModel(models.Model): id = models.PositiveIntegerField(primary_key=True) name = models.CharField(max_length=500) # 这里的缩进必须和上面的字段一致,属于MyModel的内部类 class Meta: managed = False
2. 清理旧的迁移文件
如果在设置managed=False之前,你已经运行过makemigrations生成过创建表的迁移,那即使后来修改了managed=False,Django可能还会基于之前的迁移历史继续生成相关操作。
解决办法:
- 如果你还没把旧迁移应用到数据库(没运行
migrate),直接删除app目录下migrations文件夹里除了__init__.py之外的所有文件,然后重新运行python manage.py makemigrations,这时候就不会生成创建表的迁移了。 - 如果已经应用了旧迁移,你可以手动编辑现有的迁移文件,把创建
MyModel表的操作删除;或者创建一个新的迁移,明确标记该模型为非托管(不过更简单的是,既然是自定义SQL视图,后续Django不会再管理它的结构,只要确保之后的迁移不涉及这个模型即可)。
3. 排查模型继承或配置冲突
如果你的MyModel继承了其他自定义模型,要检查父模型的Meta类是否设置了managed=True,并且没有被子类覆盖。不过从你给出的代码看,模型直接继承models.Model,这个情况概率很低,但也可以确认一下。
总结一下:先检查Meta类的缩进,这90%能解决问题;如果不行,再清理旧迁移文件,基本就能搞定了。
内容的提问来源于stack exchange,提问作者Cerin
相关产品推荐
相关产品推荐

