Django执行makemigrations未识别新模型,提示"No changes detected"
碰到这种情况确实挺闹心的——明明写了新模型,Django却完全没识别到。我帮你梳理几个最常见的原因和对应的解决办法,一步步来应该就能搞定:
第一步:检查应用是否加入了INSTALLED_APPS
这是新手最容易踩的坑!你用manage.py startapp supplier创建了应用,但Django不会自动把它加到项目配置里。打开项目根目录的settings.py,找到INSTALLED_APPS列表,把'supplier'添加进去,示例:INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 新增这一行,别忘了末尾的逗号 'supplier', ]第二步:确认模型定义没有语法错误
检查你的supplier/models.py,确保模型正确继承了models.Model,且字段定义没有语法问题。比如一个标准的模型写法应该是这样的:from django.db import models class Supplier(models.Model): name = models.CharField(max_length=100) contact_email = models.EmailField(blank=True) def __str__(self): return self.name要是少了
models.Model继承,或者字段的括号没闭合、参数写错,Django会直接忽略这个模型。第三步:指定应用名称执行migrations
有时候全局扫描可能会漏掉你的应用,试试直接指定supplier来生成迁移文件:python manage.py makemigrations supplier这个命令会强制Django只关注supplier应用的模型变化,大概率能触发迁移文件生成。
第四步:检查migrations目录是否存在
看看supplier应用下有没有migrations文件夹,里面有没有__init__.py文件。如果没有的话,手动创建一个空的migrations文件夹,再在里面新建一个空的__init__.py文件(这个文件是让Python把migrations当成模块识别的关键),然后再执行makemigrations。第五步:清除迁移缓存(谨慎操作)
如果上面的方法都没用,可能是旧的迁移缓存搞鬼了。这时候可以:- 删除supplier/migrations目录下除了
__init__.py之外的所有文件 - 如果你用的是SQLite,备份好
db.sqlite3之后删除它(其他数据库的话可以清空对应的迁移表) - 重新执行
python manage.py makemigrations和python manage.py migrate
- 删除supplier/migrations目录下除了
内容的提问来源于stack exchange,提问作者iuuujkl

