Как задать имя поля в агрегате django?

Например, Мои программы: [{"name": "html"}, {"name": "css"}, {"name": "css"}, {"name": "css"}] в базе данных.

models.py

class Program:
    name = models.CharField(max_length=50)

views.py

class ProgramCountView(APIView):
    def get(self, request):
        query_list = []
        programs = Program.objects.distinct().values_list("name", flat=True)
        for program in programs:
            query_list.append(Count("name", filter(Q(name=program)))
        result = Program.objects.aggregate(*query_list)
        return Response(result)

Но ошибка была: Сложные агрегаты требуют псевдонима. Я хочу получить результат типа {"html": 1, "css": 3}

Используйте словарь для хранения ваших подсчетов и распаковывайте их как аргументы ключевых слов при передаче в aggregate()

class ProgramCountView(APIView):
    def get(self, request):
        queries = {}
        programs = Program.objects.distinct().values_list("name", flat=True)
        for program in programs:
            queries[program] = Count("name", filter=Q(name=program))
        result = Program.objects.aggregate(**queries)
        return Response(result)
Вернуться на верх