Django动态OR查询

时间:2008-12-09 09:03:43

标签: django django-models

我在持有汽车品牌的表格上有MultipleChoiceField。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何动态获取所有Q(make=...)语句?

我如何开始:['value1', 'value2', ...]

我想如何结束:Q(col='value1') | Q(col='value2') | ...

我还有其他几种方法。我已经尝试为每个make添加查询集并以相反的方式执行(执行多个排除)但它们都非常慢。

3 个答案:

答案 0 :(得分:6)

您是否尝试过:Model.objects.filter(make__in=list_of_makes)

list_of_makes是MultipleChoiceField

返回的内容

请参阅the query set reference有关__in运营商的信息。

答案 1 :(得分:4)

#django中提供了另一种方法:

reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])

Ber's method非常适用于此实例,但如果您需要对动态列进行过滤,则映射看起来就像下一个最干净的方式。

答案 2 :(得分:3)

我尝试了Oli的答案,但它没有用,即使使用reduce(),因为看起来Q对象不接受字典作为参数:

以下是我的工作方式:

# These are the fields I want to search with an OR clause
search_fields = ['title__icontains', 'publisher__name__icontains', 'authors__name__icontains']

search = 'search string'
clauses = []
for item in search_fields:
    clauses.append(queryset.filter(**{item: search}))
    queryset  = reduce(lambda x, y: x | y, clauses).distinct()

检查性能问题,因为我只能使用小型数据集进行测试。