Как я могу получить различные значения набора запросов? - PullRequest
1 голос
/ 05 июня 2019

У меня есть такой запрос, как

query1 = A.objects.filter(a=a).values('color__red')

И отладчик сказал мне, что:

<QuerySet [{'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}, {'color__red': 'yes'}]>

Я бы хотел посчитать количество различных значений color__red (в моем случаеэто один, потому что color__red = 'yes', но иногда это может быть 2)

Я знаю, что в случае массивов мне нужно сделать len(list(set(array))), но я не могу получить значение в случаеqueryset.

Не могли бы вы помочь мне, пожалуйста?

Спасибо!

1 Ответ

2 голосов
/ 05 июня 2019

Вы можете добавить .distinct() [Django-doc] к набору запросов:

query1 = A.objects.filter(a=a).values('color__red').distinct()

В случае, если вы хотите считать количество различных объектов, которые вы можете использовать .count() [Django-doc] :

n_colors = A.objects.filter(a = a).values('color__red').distinct().count()

Вы также можете определить .aggregate(..) [Django-doc] здесь и работа с Count выражением [Django-doc] здесь:

n_colors = A.objects.filter(a=a).aggregate(n_colors = Count('color__red', distinct=True))['n_colors']

Фильтр уникальности будет выполняться на уровне базы данных.Таким образом, Django создаст запрос вроде:

SELECT DISTINCT app_color.red
FROM app_a
LEFT OUTER JOIN app_color ON app_color.a_id = a.app_a.id
WHERE app_a.a = a

и для запроса .count():

SELECT COUNT(*)
FROM 
    (SELECT DISTINCT app_color.red
     FROM app_a
     LEFT OUTER JOIN app_color ON app_color.a_id = a.app_a.id
     WHERE app_a.a = a)

с агрегатом, который мы получим:

SELECT COUNT(DISTINCT app_color.red) AS n_colors
FROM app_a
LEFT OUTER JOIN app_color ON app_color.a_id = a.app_a.id
WHERE app_a.a = a

Итакэто делается в базе данных, которая обычно быстрее, и, кроме того, объем данных, передаваемых из базы данных в приложение, значительно меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...