【问题标题】:Dynamically build complex queries with Q() in Django [closed]在 Django 中使用 Q() 动态构建复杂查询 [关闭]
【发布时间】:2023-03-17 12:10:01
【问题描述】:

First example:

# ANDing Q objects
q_object = Q()
q_object.add(Q(), Q.AND)

# ORing Q objects
q_object = Q()
q_object.add(Q(), Q.OR)

Second example:

>>> import operator
# create a list of Q objects
>>> mylist = [Q(question__contains='dinner'), Q(question__contains='meal')]
# OR
>>> Poll.objects.filter(reduce(operator.or_, mylist))
[<Poll: what shall I make for dinner>, <Poll: what is your favourite meal?>]
# AND
>>> Poll.objects.filter(reduce(operator.and_, mylist))
[]

这种技术可能非常有用,例如在 eBay 上为带有条件过滤器的页面构建查询。

但是,据我所知,这件事没有记录在案,那么对于这件事有哪些最佳实践,不会放弃支持,也不会混淆阅读我的代码的人?

ps
而且 - 将“&”运算符与 Q() 对象一起使用是一个好的解决方案吗?在 Django-docs 中我一无所获!

【问题讨论】:

    标签: python django filter django-queryset django-q


    【解决方案1】:

    查看the doc
    可以使用&amp;operator.and_ 来表示'AND',或更短:

    >>> mylist = [Q(question__contains='dinner'), Q(question__contains='meal')]
    # AND
    >>> Poll.objects.filter(reduce(operator.and_, mylist))
    # could be 
    >>> Poll.objects.filter(*mylist)
    

    【讨论】:

      【解决方案2】:

      Q 用法是一个文档化的特性,并且是一个公共的 Django API。这确实意味着它是稳定的,并且根据 Django 向后兼容性政策不会消失。

      https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

      【讨论】:

      • 我的意思不是通常使用 Q(),而是以特定方式使用它
      • 看不出你的 Q 用法有什么特别之处。你只需使用它的公共接口。
      • 在文档中我没有看到任何关于“&”运算符和 Q() 查询的动态构建的信息。
      • 它记录在 Q 的文档字符串中: > 将过滤器封装为可以逻辑组合的对象(使用 & 和 |)。
      猜你喜欢
      • 2021-01-17
      • 2021-07-13
      • 2020-04-22
      • 2013-05-24
      • 2021-05-27
      • 2013-12-11
      • 1970-01-01
      • 2016-06-06
      相关资源
      最近更新 更多