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
相关产品推荐
相关产品推荐

