2008-12-09 47 views
4

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

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

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

我有几个其他的方法。我试着为每个make添加查询集并以相反的方式执行(执行多个排除),但他们都很慢。

回答

6

你试过了吗:Model.objects.filter(make__in=list_of_makes)

的list_of_makes就是由MultipleChoiceField

回来见the query set reference有关__in操作。

+0

这是巫术魔法! – Oli 2008-12-09 09:45:55

4

有在#django提供了另一种方法:

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

Ber's method是伟大的,这种情况下,但如果你需要在动态列过滤,映射看起来像下一个干净的方式。

+0

你可以在这里使用__in运营商还,如果动态构造参数: 查询= { '%s__in' %COL_NAME:list_of_values} 使用关键字ARG扩展 Model.objects.filter(**查询) – Ber 2008-12-09 11:42:22

3

我试图奥利的答案,但它没有工作,即使有减少(),因为它出现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() 

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