Django序列化器-按过滤器返回值的总和

时间:2018-12-03 08:48:24

标签: ajax django chart.js django-aggregation

此帖子之后:Serializer - Django REST Framework - The serializer field might be named incorrectly and not match any attribute or key on the `str` instance

我使用此功能:

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
}

但是我只想获得一个值:每月的working_hour总数。

第二个问题是:如何将此值传递给我的“数据”?我是这样想的: “数据”:$ .ajax({     网址:“ / my-json-url /”,     方法:“获取”, })

对吗?

每笔预付款

1 个答案:

答案 0 :(得分:1)

首先,您可以尝试这样:

    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的数组数据

enter link description here的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})