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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:46:26