猿问

使用条件为“OR”的字典在 Q 查找中包含属性的最佳 Python 方法

当我使用字典在 Qlookup 中包含属性时,它们与条件“AND”一起使用。如何最好地设置条件“OR”?


from django.db.models import Q


query={'manufacturer':'1','release_date':'2019'}

lookups = Q(**query)

print(lookups) # (AND: ('manufacturer', '1'),('release_date', '2019')) 

我希望看到类似“ (OR: ('manufacturer', '1'),('release_date', '2019')) ”


郎朗坤
浏览 154回答 2
2回答

守候你守候我

我们可以在这里创建一个函数来生成这样的Q:from django.db.models import Qfrom functools import reducefrom operator import or_def q_or(**kwargs):&nbsp; &nbsp; if kwargs:&nbsp; &nbsp; &nbsp; &nbsp; return reduce(or_, map(Q, kwargs.items()))&nbsp; &nbsp; 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'))>

慕码人8056858

您可以设置lookups为 dict 项中的第一个查询约束,并|=在循环中使用运算符来保持聚合Q对象lookups与其余 dict 项指定的约束:lookups, *rest = map(Q, query.items())for constraint in rest:&nbsp; &nbsp; lookups |= constraint使用您的示例输入,print(lookups)将输出:<Q: (OR: ('manufacturer', '1'), ('release_date', '2019'))>
随时随地看视频慕课网APP

相关分类

Python
我要回答