Для циклу:
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-об’єкт. Будь-яка операція, пов’язана з цим, просто відмовиться від неї.