Подсчет объектов в 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
соответственно.