группировать данные api отдыха по дням и часам. Django каркас отдыха - PullRequest
0 голосов
/ 02 августа 2020

Я новичок в django и остальной структуре API. У меня есть проект, над которым я работаю, используя оба и vueJS для интерфейса. Мне нужно сериализовать некоторые данные для диаграммы.

Для одной из конечных точек API я пытаюсь сгруппировать данные следующим образом:

    "day_of_the_week": {
        "9am":[{"job":".."}],
        "10am":[{"job":"..."}],
        "11am": [{"job": ".."}],
        ...
    }

Я использую класс Job для ссылка, вот как выглядит конечная точка заданий: jobs-api

Итак, вместо того, что у меня есть на картинке, я создаю новую конечную точку, где я покажу только один объект, содержащий данные за любой день. В передней части есть диаграмма с фильтрами, которые позволяют пользователю фильтровать задания по дням, которые они запрашивают. При загрузке, когда пользователь не указал день недели, конечная точка вернет объект «сегодня».

Поскольку я новичок в этом, я не знаю, где это сделать, мой начальный думал, что нужно отфильтровать views.py, но пока я сделал это в сериализаторе, который выдает ошибку «Объект типа Job не JSON сериализуемый».

Так выглядит сериализатор например: jobs-by-day-serializer

Очевидно, есть кое-что, что я не совсем понимаю, поэтому любая помощь будет оценена.

EDIT: это мой views.py сейчас, я добавил фильтр для набора запросов для фильтрации по дням, поэтому теперь я могу фильтровать по дням: jobs_by_day_viewset

Ответы [ 2 ]

0 голосов
/ 11 августа 2020

Приведенные ответы дают решение одной части вопроса. Мне удалось решить вторую часть. Как только я смог отфильтровать свой запрос по дням недели, мне все равно пришлось сгруппировать каждый объект по часу, в который он был запущен. Вот как я решил это:

 def get(self, request):
    params = self.get_params()
    queryset = Job.objects.filter(
        dt_start__week_day=params['day'], dt_start__gte=params['dt_start'], dt_end__lte=params['dt_end'])
    queryset_started = queryset.annotate(hour=ExtractHour('dt_start'))
    queryset_ended = queryset.annotate(hour=ExtractHour('dt_end'))
    started = []
    ended = []
    total_jobs =[]
    for n in range(0, 23):
        queryset_end = queryset_ended.filter(hour=n)
        ended.append(round(queryset_end.count() / queryset.count() * 100, 2))
        queryset3 = queryset_started.filter(hour=n)
        started.append(round(queryset3.count() / queryset.count() * 100, 2))
    for x in range(len(started)):
        total_jobs.append(round(started[x]+ended[x], 2))

Я использовал набор представлений, расширенный из APIview вместо наборов моделей, чтобы я мог вернуть массив целых чисел.

0 голосов
/ 02 августа 2020

Я думаю, что правильным способом сделать это было бы реализовать сериализатор модели, а затем определить представления.

Хорошая причина для реализации разных сериализаторов - это возвращать разные результаты для одной и той же модели. Но в вашем случае вам просто нужно указать подмножество c из Job, поэтому я думаю, что представление - лучший выбор.

Я предполагаю, что вы уже реализовали JobSerializer, и, вероятно, у вас есть JobViewSet в L / C / U / M поверх модели.

Итак, теперь вам просто нужно реализовать новое представление для этой задачи. Что-то вроде этого могло сработать,

from jobs.models import Job
from jobs.serializers import JobSerializer
from rest_framework import generics


class JobByDayList(generics.ListCreateAPIView):
    serializer_class = JobSerializer

    def get_queryset(self):
        # get the day from parameters
        day_query = self.kwargs['day_query']
        # here your logic to get desire queryset
        return queryset

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...