在 Django 中使用 Q() 动态构建复杂查询 [关闭]

Posted

技术标签:

【中文标题】在 Django 中使用 Q() 动态构建复杂查询 [关闭]【英文标题】:Dynamically build complex queries with Q() in Django [closed] 【发布时间】:2013-02-04 03:22:22 【问题描述】:

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 中我一无所获!

【问题讨论】:

【参考方案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 的文档字符串中: > 将过滤器封装为可以逻辑组合的对象(使用 & 和 |)。

以上是关于在 Django 中使用 Q() 动态构建复杂查询 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Django:为相关表构建动态 Q 查询

Django Q 对象(复杂查询)是不是安全?

如何将复杂的 django 查询构建为字符串

Django Q AND 查找 - 在复杂查找中查询多个条目

如何从字符串内的括号中使用 Django Q 对象创建动态查询

为了在 Django 中过滤数据,为多列构建动态查询