Django - 将列表转换为 Q 对象的组合 OR 的正确方法 [重复]

Posted

技术标签:

【中文标题】Django - 将列表转换为 Q 对象的组合 OR 的正确方法 [重复]【英文标题】:Django - correct way to convert list to combined OR for Q object [duplicate] 【发布时间】:2018-04-08 18:30:24 【问题描述】:

我有 QueryDict 列表 'value': ['1', '2', '3', '4', '5'] - 元素数量未知。我需要使用 OR 条件将此列表转换为过滤模型:

 Poll.objects.get(Q(value__icontains=option[0]) | Q(value__icontains=option[1]))

在 SQL 中:

AND (value LIKE '%1%' OR value LIKE '%2%')

如何实现这种正确而简单的方法?

【问题讨论】:

【参考方案1】:

您可以使用reduce 操作来组合Q 对象。

解决方案

from functools import reduce
import operator
options = ['1', '2', '3', '4']

# uses operator or to combine the Q objects with the particular option filter
query = reduce(operator.or_, (Q(value__icontains=option) for option in options))

polls = Poll.objects.get(query)

【讨论】:

【参考方案2】:

Poll.objects.get(value__in=['1', '2', '3', '4', '5']) 应该这样做。

或者,对于不区分大小写的查询,请参见此处:Django query case-insensitive list match

【讨论】:

这与 OP 正在寻找的 icontains 查询不同。 你说得对;更新的答案。 @TeaPow 还是不一样。在您的查询中,值必须是列表中的字符串之一,OP 只需要值来包含其中之一。 @SachinKukreja Nah,它是 OR。列表中的一击即可。

以上是关于Django - 将列表转换为 Q 对象的组合 OR 的正确方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Django 查询:返回一个将转换为“AND (...)”的 Q 对象

在Django中组合Q对象并限制其中之一

在Django Q对象中查找最新日期

Django ORM 中的 AND OR 组合

django查询中or-ing Q对象的性能影响

django 模型