django_DRF_学习方式之框架源码自学:案例:重写ModelViewSet下的list方法,并保持分页特性
preface
- 学习某一个框架过程中的很多时候,除了查阅框架文档,还可以自主的通过查看源码来学习框架作者的编码技巧(特别是python,能够轻松的看到一些源码)
- 其他资源:视频教程/论坛/相关框架的开源项目
重写list方法,并保持分页功能
class WordStarLoggedModelViewSet(ModelViewSet):
queryset = wsob.all()
serializer_class = WordStarModelSerializer
filter_fields = ["spelling", "user"]
def list(self, req, *args, **kwargs):
user_d = req.session.get("cxxu")
uid = user_d["uid"]
queryset = wsob.filter(user=uid)
# ser = self.get_serializer_class()(queryset, many=True)
# return Res(ser.data)
# 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)
- 上面这段代码是如何得到的呢?
- 首先,我知道,drf的ModelViewSet提供的list()方法(非重写),具有分页功能
- 而经过我的重写的list方法(和被继承的方法有相同的函数签名),但是却没有了分页功能,相关代码如下
def list(self, req, *args, **kwargs):
user_d = req.session.get("cxxu")
uid = user_d["uid"]
queryset = wsob.filter(user=uid)
ser = self.get_serializer_class()(queryset, many=True)
return Response(ser.data)
借助IDEA(pycharm),查看被覆盖的list方法源码:

自定义的ModelViewSet子类的一个多继承父类ListModelMixin(源码如下)
class ListModelMixin:
"""
List a queryset.
"""
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)
-
嗯~ o( ̄▽ ̄)o大概看出来了,父类的方法中带有page相关操作,于是我将这部分代码复制出来,并改造为适合子类需求的形式.
-
确实如此
-
![在这里插入图片描述]()


浙公网安备 33010602011771号