为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2022-05-24 17:17:11
当我使用字典在 Qlookup 中包含属性时,它们与条件“AND”一起使用。如何最好地设置条件“OR”?from django.db.models import Qquery={'manufacturer':'1','release_date':'2019'}lookups = Q(**query)print(lookups) # (AND: ('manufacturer', '1'),('release_date', '2019')) 我希望看到类似“ (OR: ('manufacturer', '1'),('release_date', '2019')) ”
查看完整描述

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'))>


查看完整回答
反对 回复 2022-05-24
?
慕码人8056858

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'))>


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号