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() и сократить количество запросов до одного.

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