DRF API返回带有过滤列表的列表

时间:2019-09-26 14:51:18

标签: python django api django-rest-framework

返回的数据是一个包含所有字段的列表。我希望将数据分隔在主列表内的不同列表中。例如,在今天之前的日期和今天之后的列表中过滤的数据列表。我可以编写两个端点,并在查询集中过滤数据,但这将需要两个单独的API调用。

视图集:

class StudyPageViewSet(viewsets.ModelViewSet):
    """
    Study create, read, update, delete over API.
    """
    model = Study
    serializer_class = StudyPageSerializer
    permission_classes = (IsAuthenticated, IsAuthorPermission,)

    def get_queryset(self):
        return Study.on_site.all()

序列化器:

class StudyPageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Study
        fields = ('id', 'title', 'date', 'location')
        read_only_fields = ('id',)

结果应为:

[ 
   { 
      "list_before_today":[ 
         { 
            "id":"5001",
            "title":"None"
         },
         { 
            "id":"5002",
            "title":"Glazed"
         },

      ]
   },
   { 
      "list_after_today":[ 
         { 
            "id":"5003",
            "title":"None"
         },
         { 
            "id":"5004",
            "title":"Glazed"
         },

      ]
   },

]

当前输出:

[
    {
        "id": 588,
        "title": "title",
        .. : ..
    },
    {
        "id": 590,
        "title": "title2",
        .. : ..
    },
]

ps。点代表其他字段。

1 个答案:

答案 0 :(得分:1)

默认情况下,当您在ModelViewSet视图中调用GET请求时,它将调用list方法。在列表方法内部,Rest框架确实使用Model创建了一个查询集来查询数据,然后将其传递到Serializer中以序列化数据然后返回它,这就是为什么要这样做:

[
    {
        "id": 588,
        "title": "title",
        .. : ..
    },
    {
        "id": 590,
        "title": "title2",
        .. : ..
    },
]

因此,要获得预期的响应,您必须重写该list方法以获取具有预期格式的响应,如下所示:

from datetime import date

from rest_framework import status

class StudyPageViewSet(viewsets.ModelViewSet):
    """
    Study create, read, update, delete over API.
    """
    model = Study
    serializer_class = StudyPageSerializer
    permission_classes = (IsAuthenticated, IsAuthorPermission,)

    def get_queryset(self):
        return Study.on_site.all()

    def list(self, request):
        queryset = self.get_queryset()
        today = date.today()

        output = [{
            "list_before_today": self.get_serializer(queryset.filter(date__lt=today), many=True).data
        }, {
            "list_after_today": self.get_serializer(queryset.filter(date__gt=today), many=True).data
        }]


        return Response(output, status=status.HTTP_200_OK)

这只是个主意,因此您必须与代码保持一致才能使其正常工作。我也不建议您这样做,因为ModelViewSet由Django Rest Framework很好地定义了,如果您想获得该响应,还可以创建另一个APIView来处理它。

希望有帮助!

相关问题