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

Django QuerySet使用__date分组时created_at__date返回None问题

问题原因
  • 该问题由SQLite数据库的特性导致:SQLite没有原生的时区支持,Django内置的django_datetime_cast_date函数处理你存储的带+00:00时区后缀的ISO格式时间字符串时,日期转换逻辑失效,返回NULL,对应到Django查询结果就是None。
  • 直接查询created_at字段时不需要做日期截取与时区转换,Django直接读取原始字符串值,因此可以正常返回。
解决方案

方案1:使用TruncDate显式指定时区处理(兼容多数据库)

导入Django内置的日期截断函数,显式指定时区做日期转换:

from django.db.models import Count
from django.db.models.functions import TruncDate

result = (Activity.objects
    .annotate(date=TruncDate('created_at', tzinfo='UTC'))
    .values('date')
    .annotate(count=Count('id'))
    .values('date', 'count')
)

方案2:直接截取字符串获取日期(仅SQLite适用)

因为你存储的时间为标准ISO格式,前10位就是日期值,可以直接用SQLite字符串函数截取,规避转换问题:

result = (Activity.objects
    .extra({'date': "SUBSTR(created_at, 1, 10)"})
    .values('date')
    .annotate(count=Count('id'))
    .values('date', 'count')
)

方案3:关闭本地时区配置(仅本地开发适用)

如果仅在本地开发环境使用SQLite,可修改settings.py中配置,停止存储带时区后缀的时间,原有__date查询即可正常生效:

# settings.py
USE_TZ = False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:07