Вы можете добавить .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
Итакэто делается в базе данных, которая обычно быстрее, и, кроме того, объем данных, передаваемых из базы данных в приложение, значительно меньше.