drf重写list方法保留分页过滤功能

重写list方法, 保留分页, 过滤的功能

最近遇到一个问题, 前端小姐姐想要这种数据格式

{
    "results": [
        {
            "product_no": "C-1M-S231-01",
            "num": 2
        },
        {
            "product_no": "C-FM-B568-01",
            "num": 1
        },
        {
            "product_no": "C-FM-B568-02",
            "num": 1
        }
    ]
}

但我使用序列化器后返回的数据格式是这个样子:

		[
                {
                    "product_no": "C-FM-B568-01"
                },
                {
                    "product_no": "C-FM-B568-02"
                },
                {
                    "product_no": "C-1M-S231-01"
                },
                {
                    "product_no": "C-1M-S231-01"
                }
		]

所以我的需求是: 统计product_no一样的数据的数量, 然后返回给前端, 而且product_no一样的只返回一个

实现方式: 重写list

源码:

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

经分析, 我们只能对序列化后的结果在进行操作, 然后返回我们想要的格式

实现代码:

class DepotPalltModelViewSet(ModelViewSet):
  
    queryset = DepotPallt.objects.filter(pallet_status=1)
    serializer_class = DepotPalltModelSerializer
    # permission_classes = [IsAuthenticated,]
    filter_backends = [DjangoFilterBackend]
    filter_class = DepotDataFilter

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())   # 
        serializer = self.get_serializer(queryset, many=True)  # 保留list方法的这两行数据

        lst = []
        results = []
        for i in serializer.data:
            lst.append(i['product_no'])
        for i in set(lst):
            results.append({'product_no': i, 'num': lst.count(i)})
        return Response({'results': results})
posted @ 2021-06-29 19:24  死里学  阅读(531)  评论(0)    收藏  举报