按天和小时分组休息 api 数据。 Django 休息框架
group rest api data by day and hour. Django rest framework
我是 django 和其他 API 框架的超级新手。我有一个项目,我正在使用 vueJS 作为前端。我需要为图表序列化一些数据。
对于其中一个 API 端点,我尝试将数据分组如下:
"day_of_the_week": {
"9am":[{"job":".."}],
"10am":[{"job":"..."}],
"11am": [{"job": ".."}],
...
}
我正在使用作业 class,作为参考,作业终点如下所示:jobs-api
因此,我创建了一个新端点,而不是图片上的内容,我将只显示一个对象,其中包含任何给定日期的数据。在前端有一个带有过滤器的图表,允许用户按他们请求的日期过滤工作。在加载时,当用户没有给出星期几时,结束点将 return 'today' 的对象。
因为我是新手,我不知道在哪里做这件事,我最初的想法是在 views.py 上过滤,但现在我在序列化程序中完成了它,这给了我错误“Job 类型的对象不是 JSON 可序列化的”。
这是序列化程序的样子:
jobs-by-day-serializer
显然,有些事情我不太明白,所以任何帮助将不胜感激。
编辑:
这是我的 views.py 现在,我已经为查询集添加了按天过滤的过滤器,所以我现在可以按天过滤了:
jobs_by_day_viewset
我认为正确的做法是实现模型序列化器,然后定义视图。
实现不同序列化器的一个很好的理由是return同一模型的不同结果。但在您的情况下,您只需要 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
给出的答案提供了问题的一部分的解决方案。
我设法解决了第二部分。一旦我可以按星期几过滤我的查询集,我仍然必须按每个对象开始的时间对每个对象进行分组。
我就是这样解决的:
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 扩展而来的视图集而不是模型视图集,这样我就能够 return 一个整数数组。
我是 django 和其他 API 框架的超级新手。我有一个项目,我正在使用 vueJS 作为前端。我需要为图表序列化一些数据。
对于其中一个 API 端点,我尝试将数据分组如下:
"day_of_the_week": {
"9am":[{"job":".."}],
"10am":[{"job":"..."}],
"11am": [{"job": ".."}],
...
}
我正在使用作业 class,作为参考,作业终点如下所示:jobs-api
因此,我创建了一个新端点,而不是图片上的内容,我将只显示一个对象,其中包含任何给定日期的数据。在前端有一个带有过滤器的图表,允许用户按他们请求的日期过滤工作。在加载时,当用户没有给出星期几时,结束点将 return 'today' 的对象。
因为我是新手,我不知道在哪里做这件事,我最初的想法是在 views.py 上过滤,但现在我在序列化程序中完成了它,这给了我错误“Job 类型的对象不是 JSON 可序列化的”。
这是序列化程序的样子: jobs-by-day-serializer
显然,有些事情我不太明白,所以任何帮助将不胜感激。
编辑: 这是我的 views.py 现在,我已经为查询集添加了按天过滤的过滤器,所以我现在可以按天过滤了: jobs_by_day_viewset
我认为正确的做法是实现模型序列化器,然后定义视图。
实现不同序列化器的一个很好的理由是return同一模型的不同结果。但在您的情况下,您只需要 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
给出的答案提供了问题的一部分的解决方案。 我设法解决了第二部分。一旦我可以按星期几过滤我的查询集,我仍然必须按每个对象开始的时间对每个对象进行分组。 我就是这样解决的:
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 扩展而来的视图集而不是模型视图集,这样我就能够 return 一个整数数组。