4

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

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

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

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

4

3 回答 3

6

你有没有试过:Model.objects.filter(make__in=list_of_makes)

list_of_makes 是由MultipleChoiceField

请参阅有关运算符的查询集参考__in

于 2008-12-09T09:21:24.830 回答
4

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

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

Ber 的方法非常适合这种情况,但如果您需要过滤动态列,映射看起来是下一个最干净的方法。

于 2008-12-09T09:52:23.377 回答
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()

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

于 2010-11-15T23:19:24.107 回答