Django模型DateField设默认值迁移报日期格式错误如何解决
报错原因
你在模型中为DateField设置默认值的写法存在本质错误:default=2022-2-27、default=2022-6-27这两行代码中,没有加引号的2022-2-27会被Python识别为整数减法表达式,计算后得到的是整数结果(前者为1993,后者为1989),完全不是合法的日期类型值。Django执行迁移、校验字段默认值时,会尝试将传入的值解析为日期格式,非日期类型的错误值无法通过YYYY-MM-DD格式校验,最终抛出你看到的ValidationError。
修复方案
选择以下任意一种方式修改模型字段定义即可:
- 方案1(类型安全,官方推荐):导入Python内置的
date对象构造默认日期
先在models.py文件顶部添加导入语句:
再修改两个日期字段的default参数:from datetime import date
这种写法直接传入日期类型对象,不存在字符串格式解析问题,后续调用start_date = models.DateField(default=date(2022, 2, 27)) end_date = models.DateField(default=date(2022, 6, 27))isocalendar()等日期方法也不会出现类型错误。 - 方案2:传入符合格式要求的字符串作为默认值
直接将日期值包裹为严格符合YYYY-MM-DD格式的字符串(月、日为个位数时需要补前导零),修改字段为:start_date = models.DateField(default="2022-02-27") end_date = models.DateField(default="2022-06-27")
修改完成后,重新执行迁移命令即可正常完成数据库同步:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

