如何在Django模型DateField中存储mm-dd-yyyy格式日期并解决相关报错
问题原因
你之前使用CharField存储的是mm-dd-yyyy格式的日期字符串,直接修改字段为DateField后,SQLite数据库默认按yyyy-mm-dd的格式解析日期值,比如原来的字符串10-28-2021会被拆分为[10, 28, 2021],分别对应年、月、日,28超出了合法月份范围,因此触发报错。
解决方案
1. 新爬取数据的存储处理
存入模型前,先把爬取到的日期字符串转为Python的date对象,再赋值给DateField字段即可:
from datetime import datetime # 爬取得到的原始日期字符串 crawled_date_str = "10-28-2021" # 按mm-dd-yyyy格式解析为date对象 formatted_date = datetime.strptime(crawled_date_str, "%m-%d-%Y").date() # 赋值给模型字段保存 your_obj.issued = formatted_date your_obj.save()
2. 存量旧数据的迁移处理
之前已经存在数据库里的字符串格式日期需要先做转换,再完成字段类型修改,操作步骤如下:
- 先在模型中新增临时DateField字段:
issued = models.CharField(max_length=16) # 保留原有字段 issued_temp = models.DateField(null=True, blank=True) # 新增临时字段
- 执行迁移命令生成表结构变更:
python manage.py makemigrations python manage.py migrate
- 运行脚本批量转换旧数据:
from your_app.models import YourModel from datetime import datetime for obj in YourModel.objects.all(): if obj.issued: obj.issued_temp = datetime.strptime(obj.issued, "%m-%d-%Y").date() obj.save()
- 删除原有
issued字段,将issued_temp重命名为issued,再次执行迁移命令即可完成字段类型的替换。
可选:表单适配
如果需要通过Django表单接收该格式的日期输入,可以在表单字段中指定解析格式:
from django import forms class YourModelForm(forms.ModelForm): issued = forms.DateField(input_formats=["%m-%d-%Y"]) class Meta: model = YourModel fields = ["issued", ...]
内容的提问来源于stack exchange,提问作者Rikky Bhai
相关产品推荐
相关产品推荐

