Django中使用时间条件过滤订单无法获取QuerySet该如何解决?
订单时间过滤失效问题解决方案
核心问题
你的过滤条件与时区处理均存在问题:
- 需求是查询创建时间早于5分钟前的订单,但你使用了
__gt(大于)操作符,实际查询的是创建时间晚于5分钟前的订单,与需求完全相反 - 手动为原生datetime对象替换UTC时区的操作不规范,容易和Django项目配置的时区不匹配,导致时间对比逻辑失效
修正后的代码
from django.utils import timezone from datetime import timedelta def my_email(): # 直接生成适配当前项目时区的5分钟前时间戳 five_minutes_ago = timezone.now() - timedelta(minutes=5) print(five_minutes_ago) # __lt 表示创建时间小于该时间戳,即早于5分钟前生成的订单 orders = Order.objects.filter(createdAt__lt = five_minutes_ago) print(orders) for o in orders: print(o._id)
额外排查项
如果修改后仍然查询不到结果,可按顺序检查:
- 确认项目
settings.py中USE_TZ = True,且Order模型的createdAt字段为带时区支持的DateTimeField类型 - 手动打印数据库中现有订单的
createdAt字段值,和你生成的five_minutes_ago时间做对比,确认存在符合时间范围的订单 - 检查
Order模型是否配置了自定义的默认管理器,是否存在隐式的过滤规则排除了目标订单
内容的提问来源于stack exchange,提问作者Sohanur Rahman Shanto 16209570
相关产品推荐
相关产品推荐

