【发布时间】:2020-09-27 22:08:09
【问题描述】:
我正在尝试在 Django 中使用基于变量的 Q 对象进行动态查询,如下所示:
#...
if start_date:
start_time: datetime = get_end_of_time(start_date)
q_objects = Q(_connector=Q.OR)
query_filters = [field + '__gte' for field in fields]
for _filter in query_filters:
q_objects.add(Q(**{_filter: start_time}), Q.OR)
things = things.filter(q_objects)
if end_date:
end_time: datetime = get_end_of_time(end_date)
q_objects = Q(_connector=Q.OR)
query_filters = [field + '__lte' for field in fields]
for _filter in query_filters:
q_objects.add(Q(**{_filter: end_time}), Q.OR)
things = things.filter(q_objects)
q_objects 如下(end_date 条件):
(OR: ('created_at__lte', datetime.datetime(2020, 8, 6, 23, 59, 59, 999999, tzinfo=<DstTzInfo 'EET' EEST+3:00:00 DST>)), ('started_at__lte', datetime.datetime(2020, 8, 6, 23, 59, 59, 999999, tzinfo=<DstTzInfo 'EET' EEST+3:00:00 DST>)))
但是,它返回在指定日期之后创建_at 或started_at 的things:
started_at: 2020-07-22 12:45:48.160277+00:00
created_at: 2020-08-07 13:40:48.516932+00:00
如果我按如下方式手动查询对象,它就可以正常工作:
things = things.filter(Q(created_at__lte=end_time) | Q(started_at__lte=end_time))
所以我想知道,我做错了什么?更重要的是(所以我会学习),为什么会发生这种情况?真正困扰我的是它仅返回指定范围之外的少数情况,而不是全部。
编辑: 这是things.query的输出:
("thing"."started_at" >= 2020-08-02 00:00:00+03:00 OR "thing"."created_at" >= 2020-08-02 00:00:00+03:00) AND ("thing"."started_at" <= 2020-08-06 23:59:59.999999+03:00 OR "thing"."created_at" <= 2020-08-06 23:59:59.999999+03:00))
【问题讨论】:
-
WS
end_time:部分在这里做什么?冒号 (:) 看起来很奇怪。 -
这是一个类型提示(在python 3.8.6中添加)
标签: python django postgresql