Сериализаторы Django - возвращают сумму значений фильтром - PullRequest
0 голосов
/ 03 декабря 2018

После этого поста: Сериализатор - Django REST Framework - Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре `str`

Я использую эту функцию:

def get_month_hours(self):
    last_year = timezone.now() - datetime.timedelta(days=365)  # for more accurate result, please use python-dateutil or similar tools
    return Timesheet.objects.annotate(total_hour=Sum('working_hour')).filter(owner=self.user, date__gte=last_year).order_by('date')

Я хочу заполнить диаграмму, использующую точно такой же код:

"data": [65, 59, 80, 81, 56, 55, 40],

Все значения, соответствующие общему количеству рабочих часов (поле моих моделей) за месяц.

Итак, у меня есть 2 проблемы: во-первых, я получаю эти данные:

 {
    "id": 3,
    "title": "Développement intranet",
    "date": "2018-11-19",
    "working_hour": 8.5,
    "week": 47,
    "owner": 1
},
{
    "id": 1,
    "title": "Développement intranet",
    "date": "2018-11-26",
    "working_hour": 8.5,
    "week": 48,
    "owner": 1
},
{
    "id": 2,
    "title": "Développement intranet",
    "date": "2018-11-27",
    "working_hour": 8.5,
    "week": 48,
    "owner": 1
},
{
    "id": 4,
    "title": "dev python",
    "date": "2018-11-28",
    "working_hour": 5.25,
    "week": 48,
    "owner": 1
},
{
    "id": 5,
    "title": "Développement intranet",
    "date": "2018-12-03",
    "working_hour": 8.5,
    "week": 49,
    "owner": 1
}

Но я хочу получить только одно значение: сумму рабочего_часа в месяц.

ВтораяПроблема в том, как передать эти значения моим "данным"?Я так и думал: "data": $ .ajax ({url: '/ my-json-url /', метод: 'get',}),

верно?

спасибоза аванс

1 Ответ

0 голосов
/ 03 декабря 2018

для начала, вы можете попробовать вот так:

    return Timesheet.objects.annotate(total_hour=Sum('working_hour')).filter(owner=self.user, date__gte=last_year).order_by('date')
.values_list('total_hour', flat=True)

это даст вам массив данных total_hour

в виде API от введите описание ссылки здесь Вы должны отредактировать

@api_view(['GET'])
def timesheet_total_per_month(request):
    hours = ReturnHour(request.user.pk, datetime.datetime.now().isocalendar()[1])
    timesheets = hours.get_month_hours()
    return Response({'data':timesheets})
...