我有一个MultipleChoiceField
持有汽车制造商的表格。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何Q(make=...)
动态获取所有语句?
我如何开始:['value1', 'value2', ...]
我想如何结束:Q(col='value1') | Q(col='value2') | ...
我还有其他几种方法。我已经尝试为每个 make 附加查询集并以相反的方式进行(执行多个排除),但它们都非常慢。
我有一个MultipleChoiceField
持有汽车制造商的表格。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何Q(make=...)
动态获取所有语句?
我如何开始:['value1', 'value2', ...]
我想如何结束:Q(col='value1') | Q(col='value2') | ...
我还有其他几种方法。我已经尝试为每个 make 附加查询集并以相反的方式进行(执行多个排除),但它们都非常慢。
你有没有试过:Model.objects.filter(make__in=list_of_makes)
?
list_of_makes 是由MultipleChoiceField
请参阅有关运算符的查询集参考__in
。
#django 中提供了另一种方法:
reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])
Ber 的方法非常适合这种情况,但如果您需要过滤动态列,映射看起来是下一个最干净的方法。
我尝试了 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()
检查性能问题,因为我只能用一个小数据集进行测试。