You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 存量旧数据的迁移处理

之前已经存在数据库里的字符串格式日期需要先做转换,再完成字段类型修改,操作步骤如下:

  1. 先在模型中新增临时DateField字段:
issued = models.CharField(max_length=16) # 保留原有字段
issued_temp = models.DateField(null=True, blank=True) # 新增临时字段
  1. 执行迁移命令生成表结构变更:
python manage.py makemigrations
python manage.py migrate
  1. 运行脚本批量转换旧数据:
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()
  1. 删除原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:57:05