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})
本文来自博客园,作者:长情不羁的五年,转载请注明原文链接:https://www.cnblogs.com/grlend/p/14951634.html

浙公网安备 33010602011771号