首页 > 解决方案 > 使用条件为“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')) ”

先感谢您。

标签: pythondjangolookup

解决方案


我们可以在这里创建一个函数来生成这样的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'))>

推荐阅读