สำหรับห่วง:
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
ว่างคุณควรและด้วย~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 การดำเนินการใด ๆ ที่เกี่ยวข้องกับมันจะทำให้มันหายไปทั้งหมด