我有一个MultipleChoiceField
在持有汽车的形式。我想过滤我的汽车数据库到已检查的品牌,但这会导致问题。如何动态获取所有Q(make=...)
语句?Django动态OR查询
我如何开始:['value1', 'value2', ...]
如何我想结束:Q(col='value1') | Q(col='value2') | ...
我有几个其他的方法。我试着为每个make添加查询集并以相反的方式执行(执行多个排除),但他们都很慢。
我有一个MultipleChoiceField
在持有汽车的形式。我想过滤我的汽车数据库到已检查的品牌,但这会导致问题。如何动态获取所有Q(make=...)
语句?Django动态OR查询
我如何开始:['value1', 'value2', ...]
如何我想结束:Q(col='value1') | Q(col='value2') | ...
我有几个其他的方法。我试着为每个make添加查询集并以相反的方式执行(执行多个排除),但他们都很慢。
你试过了吗:Model.objects.filter(make__in=list_of_makes)
?
的list_of_makes就是由MultipleChoiceField
回来见the query set reference有关__in
操作。
有在#django提供了另一种方法:
reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])
Ber's method是伟大的,这种情况下,但如果你需要在动态列过滤,映射看起来像下一个干净的方式。
你可以在这里使用__in运营商还,如果动态构造参数: 查询= { '%s__in' %COL_NAME:list_of_values} 使用关键字ARG扩展 Model.objects.filter(**查询) – Ber 2008-12-09 11:42:22
我试图奥利的答案,但它没有工作,即使有减少(),因为它出现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()
检查性能问题,因为我只能用小数据集进行测试。
这是巫术魔法! – Oli 2008-12-09 09:45:55