亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用條件為“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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號