对于前端的表格数据,需要返回数据本身的序号,不是这个记录的ID。如果直接使用DRF的序列化功能则不能产生这个序号,因此要对DRF内置的ListModelMixin类进行修改。
class ListModelMixin(object):
“””
List a queryset.
“””
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset) #paginate_queryset定义在pagination.py文件中
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data) #分页后的调用,可以在修改data实现列的扩展
serializer = self.get_serializer(queryset, many=True) #未分页的返回结果,可以在修改data实现列的扩展
return Response(serializer.data)
该类中的paginate_queryset()调用的是pagination.py调用的分页类,默认的分页类为PageNumberPagination。如果需要分页,即page不为None,则调用get_paginated_response进行序列化。其结果是调用默认的PageNumberPagination中的get_paginated_response方法,并返回如下JSON字符内容。
def get_paginated_response(self, data): #修改后能改变返回分页数据的格式
return Response(OrderedDict([
(‘count’, self.page.paginator.count),
(‘next’, self.get_next_link()),
(‘previous’, self.get_previous_link()),
(‘results’, data)
]))
如果要修改返回既可以在这个地方添加或者修改。
最好的方式是创建新的分页类,重写get_paginated_response方法。
总结,如果DRF设置了分页。则如果URL请求要求分页,就会调用分页类中的方法生成分页返回信息。否则就需要在ListModelMixin的seriaizer.data中修改返回的信息。