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 @ 2023-07-06 16:15  xuchaoxin1375  阅读(8)  评论(0)    收藏  举报  来源