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'))>
添加回答
舉報