Передача СУММАРНЫХ данных из Django в React с помощью DRF

Я начинаю тестировать некоторые данные API между django и React, используя Rest API. Я могу отправить эти данные между моделью Djnago и React front end.

[
    {
        "id": 1,
        "gender": "Male",
        "age": 40,
        "updated": "2022-04-25T18:55:23.304456Z",
        "created": "2022-04-25T14:07:48.282139Z"
    },
    {
        "id": 2,
        "gender": "Male",
        "age": 33,
        "updated": "2022-04-25T18:55:23.304456Z",
        "created": "2022-04-25T14:07:48.282139Z"
    },
    {
        "id": 3,
        "gender": "Female",
        "age": 22,
        "updated": "2022-04-25T18:55:23.304456Z",
        "created": "2022-04-25T14:07:48.282139Z"
    },
    {
        "id": 4,
        "gender": "Female",
        "age": 33,
        "updated": "2022-04-25T18:55:23.304456Z",
        "created": "2022-04-25T14:07:48.282139Z"
    },
]

Моя цель - не представить эти необработанные данные, а вместо этого представить сводные данные (анализ данных), которые вычисляют средний возраст для мужчин и женщин, поэтому я должен получить что-то вроде этого:

[
        {
            "gender": "Male",
            "average_age": 36.5,
        },
        {
            "gender": "Male",
            "average_age": 27.5,
        }
]

Где я должен делать эти перекрестные табуляции? В бэкенде или фронтэнде? Если в бэкенде, то должен ли я создавать новые модели для сводных данных?

Я пытался искать в Интернете советы по этому поводу, но мне не повезло!

Для выполнения агрегации в бэкенде можно использовать Django-запрос; для сводных данных новая модель не нужна.

SQL-запрос для получения среднего возраста по полу из таблицы 'person' будет выглядеть следующим образом.

SELECT gender, AVG(age) AS average_age
FROM person
GROUP BY gender;

Эквивалентный запрос Django будет выглядеть следующим образом.

from django.db.models import Avg

result = Person.objects.values('gender')
                       .annotate(average_age=Avg('age'))

ОБНОВЛЕНИЕ: Добавление представления API на основе классов

class GetData(APIView):
        
    def get(self):
        
        result = Test.objects.values('gender').annotate(average_age=Avg('age'))
        
        response_data = {}
        response_data['data'] = list(result)
        
        return Response(response_data, status=status.HTTP_200_OK)

urls.py должен быть обновлен для использования этого представления API.

path('getdata/', GetData.as_view()),
Вернуться на верх