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()
것이 중요 합니다. 이를 포함하는 모든 작업은 완전히 삭제됩니다.