2 回答
TA贡献1802条经验 获得超10个赞
我们可以在这里创建一个函数来生成这样的Q:
from django.db.models import Q
from functools import reduce
from operator import or_
def q_or(**kwargs):
if kwargs:
return reduce(or_, map(Q, kwargs.items()))
return Q(pk__in=())
我们在这里构造的Q(pk__in=())东西总是False. 如果 . 中根本没有项目,则返回它**kwargs。
然后我们可以使用它:
lookups = q_or(**{'manufacturer':'1','release_date':'2019'})
或更优雅地:
lookups = q_or(manufacturer='1', release_date='2019')
这将给我们:
>>> q_or(manufacturer='1', release_date='2019')
<Q: (OR: ('manufacturer', '1'), ('release_date', '2019'))>
TA贡献1803条经验 获得超6个赞
您可以设置lookups为 dict 项中的第一个查询约束,并|=在循环中使用运算符来保持聚合Q对象lookups与其余 dict 项指定的约束:
lookups, *rest = map(Q, query.items())
for constraint in rest:
lookups |= constraint
使用您的示例输入,print(lookups)将输出:
<Q: (OR: ('manufacturer', '1'), ('release_date', '2019'))>
添加回答
举报
