Vòng lặp 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)
Giảm:
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)
Cả hai điều này đều tương đương với Article.objects.filter(pk__in=values)
Điều quan trọng là phải xem xét những gì bạn muốn khi values
trống rỗng. Nhiều câu trả lời có Q()
giá trị bắt đầu sẽ trả về mọi thứ . Q(pk__in=[])
là một giá trị khởi đầu tốt hơn. Đó là một đối tượng Q luôn gặp lỗi được trình tối ưu hóa xử lý độc đáo (ngay cả đối với các phương trình phức tạp).
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
Nếu bạn muốn trả lại mọi thứ khi values
trống, bạn nên VÀ với ~Q(pk__in=[])
để đảm bảo rằng hành vi:
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
Điều quan trọng cần nhớ Q()
là không là gì cả , không phải là đối tượng Q luôn thành công. Bất kỳ hoạt động nào liên quan đến nó sẽ chỉ thả nó hoàn toàn.