Как динамично сочинить, ИЛИ запрос просачиваются Django?

92
задан Tomasz Jakub Rup 14 December 2015 в 22:22
поделиться

6 ответов

Вы можете связать запросы следующим образом:

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)
143
ответ дан 24 November 2019 в 06:22
поделиться

См. документы :

>>> 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])
8
ответ дан 24 November 2019 в 06:22
поделиться

Вы можете использовать оператор | = для программного обновления запроса с использованием объектов Q.

4
ответ дан 24 November 2019 в 06:22
поделиться

Может быть, лучше использовать инструкцию 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)
19
ответ дан 24 November 2019 в 06:22
поделиться
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))
35
ответ дан 24 November 2019 в 06:22
поделиться

Более короткий способ написания ответа Дэйва Уэбба с использованием функции сокращения 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)  
44
ответ дан 24 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: