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相关操作,于是我将这部分代码复制出来,并改造为适合子类需求的形式.
-
确实如此
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-07-06 java_regex提取文本中的所有小数
2021-07-06 web_web参考手册/web参考文档