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 的正确方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章