【问题标题】:Django: Extracting a `Q` object from a `QuerySet`Django:从`QuerySet`中提取`Q`对象
【发布时间】:2012-03-31 00:05:14
【问题描述】:

我有一个 Django QuerySet,我想从中得到一个 Q 对象。 (即包含与该查询集完全相同的查询。)

这可能吗?如果有,怎么做?

【问题讨论】:

    标签: python django django-orm django-q


    【解决方案1】:

    如果您想要 Q 对象,那么您也可以通过 ORing 另一个 Q 对象来重构复杂查询,如果两个 QuerySet 在同一模型上,您可以直接 OR QuerySet 以获得相同的效果。值得尝试并检查前后的 SQL。

    例如:

    qs1 = model.objects.filter(...)
    print("qs1: {}".format(qs1.query)
    qs2 = model.objects.filter(...)
    print("qs2: {}".format(qs1.query)
    qs = q1 | q2
    print("qs: {}".format(qs.query)
    

    我当然找到了你的问题,因为我正是出于这个原因想要查询中的 Q 对象,并在 Django 用户组中发现:

    https://groups.google.com/d/msg/django-users/2BuFFMDL0VI/dIih2WRKAgAJ

    QuerySet 的组合方式与 Q 对象的组合方式非常相似。

    这可能对你有帮助,也可能对你没有帮助,这当然取决于你想要那个 Q 对象的原因。

    【讨论】:

      【解决方案2】:

      这不是您所要求的,但您可以通过访问查询成员从查询集中提取 sql。例如:

      x = somequeryset.query
      

      然后您可以在新的查询集对象上使用它来重建原始查询集。这可以更好地保存为查询集定义的“值”之类的内容。定义的 x 易于存储。我过去曾使用它来保存用户构建的查询/搜索,然后每天运行这些查询/搜索,并将结果通过电子邮件发送给用户。

      【讨论】:

      • 有用的信息,谢谢。仍然不如Q,因为你不能在上面使用&|~,但还是很高兴知道。
      【解决方案3】:

      不,但您可以先创建 Q 对象,然后使用它;或者,将您的查询创建为 dict,并将其传递给您的过滤器方法和 Q 对象。

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 2021-11-22
        • 2011-10-24
        • 2017-10-03
        • 2011-11-27
        • 2020-01-19
        • 2018-06-09
        • 2018-11-12
        • 2015-04-13
        相关资源
        最近更新 更多