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相关操作,于是我将这部分代码复制出来,并改造为适合子类需求的形式.

  • 确实如此

  • 在这里插入图片描述

posted @   xuchaoxin1375  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-07-06 java_regex提取文本中的所有小数
2021-07-06 web_web参考手册/web参考文档
点击右上角即可分享
微信分享提示