Django: Добавить objects.all.count() в агрегацию?
Я искал, как добавить X.objects.all().count()
результат к существующей логике агрегации. Я видел, что Count()
будет работать только с отношениями внешнего ключа, поэтому как я могу добавить "дополнительное поле" с результатами .count()
в агрегат, написав его только в одном блоке.
Это мое пользовательское действие (не работает):
from django.db.models.functions import Coalesce
from django.db.models import Min, Avg, Max, Value as Val, IntegerField
@action(detail=False, methods=['get'])
def get_stats(self, request, pk=None):
total_ads = Ad.objects.all().count()
stats = Ad.objects.aggregate(
price_min = Coalesce(Min('price'), Val(0)),
price_avg = Coalesce(Avg('price'), Val(0.0)),
price_max = Coalesce(Max('price'), Val(0)),
ads_total = Val(total_ads, output_field=IntegerField()),
)
return Response(stats)
Ошибка: TypeError: ads_total не является агрегатным выражением
Я видел, что
.Count()
будет работать только с отношением внешнего ключа, поэтому как я могу добавить "дополнительное поле" с помощью.count()
Вы также можете Count
первичный ключ, который будет считать любой неNULL
элемент, таким образом, вы можете использовать:
stats = Ad.objects.aggregate(
price_min=Coalesce(Min('price'), Val(0)),
price_avg=Coalesce(Avg('price'), Val(0.0)),
price_max=Coalesce(Max('price'), Val(0)),
ads_total=Count('pk')
)
и, таким образом, вы можете опустить запрос total_ads = Ad.objects.all().count()
и сократить количество запросов до одного.