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

Django模型DateTimeField设置default未同步至MySQL数据库问题

问题根因

你遇到的报错由3个直接问题共同导致:

  • 你模型中配置的default=datetime.now是Django ORM层面的默认值逻辑,仅当你通过Django的模型API创建数据时才会自动赋值,你直接手写原生SQL执行插入时,完全不会触发这层逻辑,而你数据库里的catalog_inclusion_date字段被设置为NOT NULL、且没有配置数据库级别的默认值,插入时不传值自然会触发1364错误。
  • 你写的INSERT语句存在严重的字段-值错位、数量不匹配问题:你指定的插入字段共7个,传入的VALUES只有6个;且字段列表第三个位置是catalog_inclusion_date,你传入的第三个值是字符串'Adidas',后续的品牌、图片地址、描述、logo颜色字段全部和值错位,即使不报默认值错误,也会出现类型不匹配、数据错乱的问题。
  • 从你贴出的表结构可以看出,模型定义和数据库实际结构不一致:你模型里写的是DateTimeField(日期时间类型),实际数据库里生成的是date(仅日期)类型,说明之前的迁移没有正确同步,或者你手动修改过表结构。
修复方案
  • 首先修正你的原生插入SQL,保证字段和值一一对应,时间字段要么显式传值,要么调用MySQL的时间函数赋值,参考写法:
INSERT INTO shoppingcart_cap(
    main_color, secondary_color, brand, 
    catalog_inclusion_date, image_url, 
    description, logo_color
) 
VALUES (
    'Red', 'Black', 'Adidas', 
    NOW(), 'https://www.rekordsport.es/uploads/photo/image/4920/gallery_A02506_1.JPG', 
    'Kid cap', 'White'
);
  • 修正模型字段配置,让默认值在数据库层面也生效,避免直接操作数据库时出现同类问题。不要使用default=datetime.now这种仅应用层生效的写法,创建时间场景优先用Django内置的auto_now_add参数,修改后重新生成并执行迁移:
# 推荐写法:创建记录时自动填充当前时间,同步到数据库层默认值配置
catalog_inclusion_date = models.DateTimeField(auto_now_add=True)

# 如果需要保留手动编辑该字段的能力,可以使用db_default配置数据库级默认值
# from django.db.models.functions import Now
# catalog_inclusion_date = models.DateTimeField(db_default=Now(), blank=True)
  • 执行迁移命令同步表结构,确保数据库字段类型和模型定义一致:
python manage.py makemigrations
python manage.py migrate

补充说明:如果你一定要保留default=datetime.now的写法,注意不要写成default=datetime.now()——加括号会在服务启动时就执行函数拿到固定时间,后续所有记录的默认时间都是服务启动的时间点,不会动态取插入时的当前时间。

内容的提问来源于stack exchange,提问作者Sergi7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:15:37