Django非空字段迁移问题:pytest触发非空约束违反错误
解决Django last_updated字段非空约束报错的方案
检查迁移文件的默认值设置:
打开生成last_updated字段的迁移文件,确认默认值是带时区的时间对象,比如datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)。如果只是写了字符串或不带时区的时间,数据库无法识别,旧数据的该字段会保持null。若写错了,直接修改迁移文件里的默认值,再重新执行迁移。重置测试环境数据库:
测试用数据库可能没正确执行迁移,跑测试前先删除测试库,执行python manage.py migrate重新迁移;如果用pytest-django,可加--recreate-db参数直接重建测试库,确保迁移完全生效。给字段添加兜底默认值:
修改models里的last_updated字段定义,补充带时区的默认值,示例代码:from django.utils import timezone last_updated = models.DateTimeField(auto_now=True, default=timezone.now)之后重新执行
makemigrations和migrate,Django会自动用这个默认值填充所有旧数据,无需手动输入默认值,从根源避免null问题。排查测试用例的对象创建逻辑:
如果测试里用bulk_create批量创建对象,或是直接操作数据库插入数据,Django的auto_now=True不会自动生效。这时要手动给测试对象指定last_updated值,或是把创建逻辑改成调用对象的save()方法。
内容的提问来源于stack exchange,提问作者RCP1990
相关产品推荐
相关产品推荐

