Django执行migrate报错:NOT NULL约束失败,求解决方案
问题分析与解决步骤
1. 先修正模型的明显错误
你的Image类里的字符串展示方法写错了,应该是双下划线的__str__,不是单下划线的_str_,先改过来:
class Image(models.Model): name = models.CharField(max_length=50, default=None) phone = models.TextField(max_length=10, default=None) img = models.ImageField(upload_to='images/', default=None) def __str__(self): # 这里改成双下划线 return self.name
2. 解决makemigrations显示“No changes detected”的问题
- 确认app已注册:检查项目根目录
settings.py里的INSTALLED_APPS,确保home已经在列表中:INSTALLED_APPS = [ ... 'home', ... ] - 重置迁移文件(谨慎操作,先备份数据库):
- 删除
home/migrations目录下除__init__.py外的所有文件 - 执行
python manage.py makemigrations home,指定app生成新迁移 - 执行
python manage.py migrate --fake-initial,让Django标记初始迁移已完成(适合数据库中已有对应表的情况)
- 删除
3. 解决NOT NULL constraint failed: new__home_image.desc错误
这个错误说明迁移时涉及到desc字段的非空约束,但当前模型里没有这个字段,大概率是旧迁移文件残留了该字段的操作:
- 检查迁移文件:打开
home/migrations下的所有文件,找出包含desc字段定义/修改的内容,确认是否是废弃操作 - 手动同步数据库与迁移状态:
- 登录数据库(比如sqlite3、MySQL),查看
home_image表是否存在desc字段,如果不需要就直接删除 - 执行
python manage.py migrate --fake,让Django同步迁移状态到最新
- 登录数据库(比如sqlite3、MySQL),查看
4. 通用排查手段
- 执行
python manage.py showmigrations home,查看该app的迁移应用状态 - 执行
python manage.py sqlmigrate home <迁移编号>,查看具体迁移的SQL语句,定位desc字段相关操作
内容的提问来源于stack exchange,提问作者Bipin Poudel
相关产品推荐
相关产品推荐

