Django如何使用filter查询当日创建的Device模型数据
问题原因
你之前的查询不生效是因为
Device模型的date_created字段是DateTimeField类型,存储的是包含「日期+时分秒」的完整时间戳,直接和仅包含日期的today做等值匹配,仅会命中创建时间恰好是今日0点0分0秒的记录,绝大多数场景都不会返回正确结果。
解决方案
方案1:使用Django内置的日期查找(推荐,Django 1.9及以上版本支持)
直接通过__date后缀提取date_created的日期部分和今日日期匹配,同时注意使用Django内置的timezone模块处理时间,避免时区不匹配问题:
from django.utils import timezone # 获取当前时区下的今日日期 today = timezone.now().date() device_today = Device.objects.filter(date_created__date=today).count()
方案2:使用时间范围查询(兼容低版本Django)
如果使用的Django版本低于1.9,可以手动限定查询时间范围为今日0点到明日0点:
from django.utils import timezone # 获取当前时区下今日的开始时间和明日的开始时间 today = timezone.now().date() today_start = timezone.make_aware(timezone.datetime.combine(today, timezone.datetime.min.time())) tomorrow_start = today_start + timezone.timedelta(days=1) device_today = Device.objects.filter(date_created__gte=today_start, date_created__lt=tomorrow_start).count()
注意事项
如果项目配置了USE_TZ = True开启了时区支持,不要使用Python原生的datetime.datetime.today()等方法获取时间,否则会出现时区偏移导致的日期统计错误。
内容的提问来源于stack exchange,提问作者Toufik Benkhelifa
相关产品推荐
相关产品推荐

