Подсчет объектов в queryset по значению в поле. Django

Представьте, что у меня есть модель, которая выглядит примерно следующим образом:

class Car(models.Model):

    TYPE_CHOICES = [
        (1: 'Hatchback')
        (2: 'Saloon')

    type = models.CharField(choices=TYPE_CHOICES, ...)

    color = models.CharField()

    owner = models.ForeignKey(User, ...)

И я хочу подсчитывать объекты по определенным значениям. Скажем, черные седаны, принадлежащие Джонам, или белые хэтчбеки, принадлежащие Маттам.

Лучшее, что я придумал на данный момент, это:

Car.objects.annotate(
    black_saloons_owned_by_John=Count(
        'type',
        filter=(
            Q(type=2) &
            Q(owner__first_name='John')
        )
    )
).aggregate(
    aggregated_black_saloons_owned_by_John=Sum(
        'black_saloons_owned_by_John'
    )
)

Есть ли лучший способ получить желаемый результат? Спасибо.

Мы можем фильтровать набор запросов, а затем использовать .count() [Django-doc]:

Car.objects.filter(type=2, owner__first_name='John').count()

или если вам нужно выполнить несколько поисков, вы можете использовать .aggregate(..) непосредственно:

Вы можете Count непосредственно Car объекты с помощью:

Car.objects.aggregate(
    total_john=Count(
        'pk', filter=Q(type=2, owner__first_name='John')
    ),
    total_matts=Count(
        'pk', filter=Q(type=1, owner__first_name='Matt')
    )
)

this затем вернет словарь, который имеет два ключа: 'total_john' и 'total_matts', и они будут содержать счетчик их количества Car соответственно.

Вернуться на верх