【问题标题】:group rest api data by day and hour. Django rest framework按天和小时分组休息 api 数据。 Django 休息框架
【发布时间】:2020-08-02 12:43:58
【问题描述】:

我对 django 和其他 API 框架非常陌生。我有一个项目,我正在使用 vueJS 作为前端。我需要为图表序列化一些数据。

对于其中一个 API 端点,我尝试将数据分组如下:

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

我正在使用 Job 类,作为参考,这是作业端点的样子:jobs-api

因此,我创建了一个新端点,而不是图片上的内容,我将只显示一个包含任何给定日期数据的对象。在前端有一个带有过滤器的图表,可让用户按他们请求的日期过滤作业。在加载时,当用户没有指定星期几时,端点将返回“今天”的对象。

因为我是新手,所以我不知道在哪里执行此操作,我最初的想法是过滤 views.py,但现在我已经在序列化程序中完成了它,这给了我错误“对象类型作业不是 JSON 可序列化的”。

这是序列化器的样子: jobs-by-day-serializer

很明显,有些东西我不太了解,因此我们将不胜感激。

编辑: 这是我的views.py,我已经为查询集添加了过滤器以按天过滤,所以我现在可以按天过滤: jobs_by_day_viewset

【问题讨论】:

  • 过滤应该在views.py中完成。您的 views.py 看起来如何?
  • 感谢您的回答,我已将视图集添加到问题中
  • 您需要做两件事:1)按查询分组。可能这会有所帮助:stackoverflow.com/questions/30465013/django-group-by-hour。 2)您需要创建自己的序列化器(可以根据需要序列化数据,而不是我猜的模型序列化器)。您应该将结果从 1 传递给该序列化程序。或者,如果 1 的输出直接为您工作,您甚至可能不需要序列化程序。
  • 谢谢,我尝试了这种方法,但无法使其正常工作,我收到错误消息:unhashable 'slice'。我猜这与我需要以某种方式将字典转换为 json 对象的事实有关?
  • 查询得到结果了吗?

标签: django api vue.js django-rest-framework django-serializer


【解决方案1】:

我认为正确的做法是实现模型序列化器,然后定义视图。

实现不同序列化程序的一个很好的理由是为同一模型返回不同的结果。但在您的情况下,您只需要 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

【讨论】:

  • 谢谢你的回答,我已经在问题中添加了视图集,我有应该工作的 fay 过滤器,但我不知道如何每小时将工作分隔成一个数组..
【解决方案2】:

给出的答案为问题的一部分提供了解决方案。 我设法解决了第二部分。一旦我可以按星期几过滤我的查询集,我仍然必须按开始的小时对每个对象进行分组。 我就是这样解决的:

 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 扩展而来的视图集,而不是模型视图集,因此我能够返回一个整数数组。

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 2021-11-26
    • 2015-06-30
    • 2013-04-08
    • 2014-08-29
    • 2016-04-25
    • 2016-03-23
    相关资源
    最近更新 更多