首页 > 解决方案 > 修改结果列表 API django-rest-framework

问题描述

我正在使用 django-rest-framework 为我的模型创建 API 休息,在我的模型上我保存了一系列日期(开始和结束),但在 API 列表中我需要按日期输入。

#serializers.py
class ShceduleSerializer(FlexFieldsModelSerializer):

    class Meta:
        model = Shcedule
        fields = ['id', 'start', 'end', 'user']


#viewsets.py
class ShceduleViewSet(FlexFieldsModelViewSet):

    queryset = Shcedule.objects.all()
    serializer_class = ShceduleSerializer

现在,我有这样的事情:

"results": [
        {
            "id": 1,
            "start": "2020-05-25",
            "end": "2020-05-29",
            "user": 50
        },

但我需要按日期输入

"results": [
            {
                "id": 1,
                "date": "2020-05-25",
                "user": 50
            },
            {
                "id": 1,
                "date": "2020-05-26",
                "user": 50
            },
            {
                "id": 1,
                "date": "2020-05-27",
                "user": 50
            },
            {
                "id": 1,
                "date": "2020-05-28",
                "user": 50
            },
            {
                "id": 1,
                "date": "2020-05-29",
                "user": 50
            },

标签: djangodjango-rest-framework

解决方案


您可以覆盖该list()方法以更改对您的需求的响应。例如:

class ShceduleViewSet(FlexFieldsModelViewSet):

    queryset = Shcedule.objects.all()
    serializer_class = ShceduleSerializer

    def list(self, request, *args, **kwargs):
        schedule_results = super().list(request=request).data
        day_delta = datetime.timedelta(days=1)

        for schedule in schedule_results['results']:
            start_date = schedule['start']
            end_date = schedule['end']
            
            schedule_objects = {'results': []}
            for i in range((end_date - start_date).days):
                schedule_objects['results'].append({
                   "id": schedule['id'],
                   "date": start_date + i*day_delta,
                   "user": schedule['user']
                })
     
            output = schedule_objects

            return Response(output, status=status.HTTP_200_OK)

推荐阅读