我在持有汽车品牌的表格上有MultipleChoiceField
。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何动态获取所有Q(make=...)
语句?
我如何开始:['value1', 'value2', ...]
我想如何结束:Q(col='value1') | Q(col='value2') | ...
我还有其他几种方法。我已经尝试为每个make添加查询集并以相反的方式执行(执行多个排除)但它们都非常慢。
答案 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()
检查性能问题,因为我只能使用小型数据集进行测试。