我是 Django 初学者,我弄清楚了如何动态创建模型查询,但当我尝试混合 AND
和 OR
时,我陷入了困境运算符:
我有一个字段列表(联系人姓名、公司、职位、国家/地区),这些字段可能包含多个关键字(以逗号“,”分隔)
因此,如果我搜索这些公司名称“imtech、ABC、FooBar”,我会使用下面的代码得到正确的结果,因为它始终使用 |
(OR) 运算符。
但是,如果我想限制搜索公司字段为“imtech、ABC、FooBar”且职位字段仅为“客户经理”的条目,该怎么办?
我知道我必须将 &
运算符放在每个字段循环的末尾,但我没有成功这样做,所以这是我的代码,请帮助我!!!
search_fields = {'contact_name', 'company', 'position', 'country'}
search_fields_values = {}
qs_params = None
for field in search_fields:
search_fields_values[field] = self.request.GET.get(field, None)
if search_fields_values[field]:
search_fields_values[field] = search_fields_values[field].split(',')
for part in search_fields_values[field]:
q = Q(**{field: part})
qs_params = qs_params | q if qs_params else q
qs = qs.filter(qs_params)
感谢一百万!
最佳答案
我希望我正确理解了你的问题。
这是理论上应该有效的(但尚未测试过):
import operator
...
search_fields = {'contact_name', 'company', 'position', 'country'}
conditions = []
for name in search_fields:
value = self.request.GET.get(name, None)
if value:
conditions.append(Q(**{name + "__in": value.split(',')}))
qs = qs.filter(reduce(operator.and_, conditions))
所以,我想到了两个想法:
- 使用
__in
代替多个OR - 收集每个搜索字段的这些
in
查询,然后使用 AND 将它们连接起来
希望有帮助。
关于python - 如何在 Django 查询中混合 AND 和 OR 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403852/