forループ:
values = [1, 2, 3]
q = Q(pk__in=[]) # generic "always false" value
for val in values:
q |= Q(pk=val)
Article.objects.filter(q)
削減:
from functools import reduce
from operator import or_
values = [1, 2, 3]
q_objects = [Q(pk=val) for val in values]
q = reduce(or_, q_objects, Q(pk__in=[]))
Article.objects.filter(q)
これらは両方とも同等です Article.objects.filter(pk__in=values)
values
が空のときに必要なものを検討することが重要です。Q()
開始値としての多くの答えはすべてを返します。Q(pk__in=[])
より良い初期値です。これは常に失敗するQオブジェクトであり、オプティマイザーによって(複雑な方程式の場合でも)うまく処理されます。
Article.objects.filter(Q(pk__in=[])) # doesn't hit DB
Article.objects.filter(Q(pk=None)) # hits DB and returns nothing
Article.objects.none() # doesn't hit DB
Article.objects.filter(Q()) # returns everything
あなたがいる場合したいとき、すべてを返すようにvalues
空である、あなたは、ANDとする必要があり~Q(pk__in=[])
、その動作を確保するために:
values = []
q = Q()
for val in values:
q |= Q(pk=val)
Article.objects.filter(q) # everything
Article.objects.filter(q | author="Tolkien") # only Tolkien
q &= ~Q(pk__in=[])
Article.objects.filter(q) # everything
Article.objects.filter(q | author="Tolkien") # everything
それQ()
は何もない、常に成功するQオブジェクトではないことを覚えておくことは重要です。それを含む操作は、それを完全に落とします。