首页 > 编程语言 >python之路64 drf从入门到成神 9个视图子类 视图集、ModelViewSet、ReadOnlyModelViewSet、ViewSetmixin源码分析、视图层大总结、自动生成路由、

python之路64 drf从入门到成神 9个视图子类 视图集、ModelViewSet、ReadOnlyModelViewSet、ViewSetmixin源码分析、视图层大总结、自动生成路由、

时间:2023-02-06 15:56:38浏览次数:44  
标签:get 子类 queryset 视图 源码 序列化 class serializer

视图

视图  View

    两个视图基类:APIView   GenericAPIView
    APIView
        执行流程:新的reqeust,三大认证,全局异常
        重写了as_view,dispatch
        类属性:parser_class,xxx

    GenericAPIView---》继承了APIView----》以后,如果是跟数据库打交道,尽量用它
        1 queryset:要序列化或反序列化的表模型数据
        2 serializer_class:使用的序列化类
        3 lookup_field :查询单条的路由分组分出来的字段名
        4 filter_backends:过滤类的配置(了解)
        5 pagination_class:分页类的配置(了解)

        方法
        1 get_queryset   :获取要序列化的对象
        2 get_object  :获取单个对象
        3 get_serializer :获取序列化类  ,跟它差不多的get_serializer_class,一般重写它,不调用它
        4 filter_queryset  :过滤有关系(了解)


    补充,根据请求方式,定制序列化类
     def get_serializer(self, *args, **kwargs):
        if self.request.method=='GET':
            return 序列化单条的序列化类
        else:
            return 新增的序列化类

5个视图扩展类----》不是视图类----》必须配合GenericAPIView
     每个类自己写了一个方法,写的不是【请求方式,不是put,get。。。】的方法,写的是list,destroy。。。
     minxin 混入,通过多继承来实现多个功能
     from rest_framework.mixins import CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin,
    ListModelMixin
    
    
     继承GenericAPIView+某个视图扩展类+请求方式的方法

9个视图子类

两个视图基类
5个视图扩展类
9个视图子类---》视图类,不需要额外继承GenericAPIView,只需要继承9个中其中某个,就会有某个或某几个接口
路由
urlpatterns = [
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>/', views.BookView.as_view()),
]

视图类
from rest_framework.generics import ListAPIView, ListCreateAPIView, CreateAPIView, \
    RetrieveAPIView, RetrieveUpdateDestroyAPIView, UpdateAPIView, DestroyAPIView
from .models import Book
from .serializer import BookSerializer

class BookView(ListCreateAPIView):  # 查询所有,新增一个
    queryset = Book.objects.all()
    serializer_class = BookSerializer

# 新增一个,修改一个,删除一个
class BookDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

因为这5个接口在不同的场景可能不需要全部都写 所以按照需求可以通过继承的父类的不同进行代码编写
eg:写一个查询所有   
   class BookView(ListAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer

    再写一个修改
    class BookDetailView(UpdateAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializer

标签:get,子类,queryset,视图,源码,序列化,class,serializer
From: https://www.cnblogs.com/xm15/p/17095629.html

相关文章