Вы можете связать запросы следующим образом:
values = [1,2,3]
# Turn list of values into list of Q objects
queries = [Q(pk=value) for value in values]
# Take one Q object from the list
query = queries.pop()
# Or the Q object with the ones remaining in the list
for item in queries:
query |= item
# Query the model
Article.objects.filter(query)
См. документы :
>>> Blog.objects.in_bulk([1])
{1: <Blog: Beatles Blog>}
>>> Blog.objects.in_bulk([1, 2])
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}
>>> Blog.objects.in_bulk([])
{}
Обратите внимание, что этот метод работает только для поиска по первичному ключу, но, похоже, это именно то, что вы пытаетесь сделать.
Итак, что вам нужно:
Article.objects.in_bulk([1, 2, 3])
Вы можете использовать оператор | = для программного обновления запроса с использованием объектов Q.
Может быть, лучше использовать инструкцию sql IN.
Article.objects.filter(id__in=[1, 2, 3])
См. справочник по API запросов .
Если вам действительно нужно делать запросы с динамической логикой, вы можете сделать что-то вроде этого (некрасиво + не проверено):
query = Q(field=1)
for cond in (2, 3):
query = query | Q(field=cond)
Article.objects.filter(query)
from functools import reduce
from operator import or_
from django.db.models import Q
values = [1, 2, 3]
query = reduce(or_, (Q(pk=x) for x in values))
Более короткий способ написания ответа Дэйва Уэбба с использованием функции сокращения Python :
# For Python 3 only
from functools import reduce
values = [1,2,3]
# Turn list of values into one big Q objects
query = reduce(lambda q,value: q|Q(pk=value), values, Q())
# Query the model
Article.objects.filter(query)