पाश के लिए:
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=[])
एक बेहतर शुरुआती मूल्य है। यह एक हमेशा विफल रहने वाली वस्तु है जिसे ऑप्टिमाइज़र (यहां तक कि जटिल समीकरणों के लिए) द्वारा अच्छी तरह से नियंत्रित किया जाता है।
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
, तो आपको ~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()
है कुछ भी नहीं , नहीं हमेशा-सफल क्यू वस्तु। इसमें शामिल कोई भी ऑपरेशन इसे पूरी तरह से छोड़ देगा।