【问题标题】:Django dynamic Q date filter gives mysterious resultsDjango 动态 Q 日期过滤器给出了神秘的结果
【发布时间】: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))

【问题讨论】:

  • WSend_time: 部分在这里做什么?冒号 (:) 看起来很奇怪。
  • 这是一个类型提示(在python 3.8.6中添加)

标签: python django postgresql


【解决方案1】:

我的问题显然是,而不是在相同的条件下链接日期

正如我在上面发布的那样,他们被锁住了。愚蠢的深夜问题。所以修复是构建它,以便查询最终看起来像 (created_at =&gt; &lt;date&gt; AND created_at &lt;= &lt;date&gt;) OR (started_at =&gt; &lt;date&gt; AND started_at &lt;= &lt;date&gt;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2021-10-01
    • 1970-01-01
    • 2017-07-22
    • 2016-01-28
    • 2022-11-05
    相关资源
    最近更新 更多