zoukankan      html  css  js  c++  java
  • restframework 视图

    重要知识点

    as_view()获取的是view方法名,当url配版成功,执行view方法

    一、逻辑封装(mixins, generics)

        path('author/', views.AuthorView.as_view()),
        path('author/<pk>/', views.AuthorDetailView.as_view()),
    路由
    from rest_framework import mixins, generics
    """
    本质:封装逻辑
    1.return 父类的方法
    2.queryset serializer_class 两个参数必要(看源码)
    3.mixins.ListModelMixin和mixins.CreateModelMixin 没有的方法到generics.GenericAPIView去找
    4.url的参数要改成pk,根据get_obj() 源码
    """
    
    
    class AuthorView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
        queryset = Author.objects.all()
        # print(queryset)
        serializer_class = AuthorModelSerializer
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
    
    class AuthorDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,
                           generics.GenericAPIView):
        queryset = Author.objects.all()
        serializer_class = AuthorModelSerializer
    
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
    视图

    二、封装类(generics)

        path('author/', views.AuthorView.as_view()),
        path('author/<pk>/', views.AuthorDetailView.as_view()),
    路由
    from rest_framework import generics
    """
    本质:对类进行封装(具体情况看源码)
    1.只需要 queryset 和 serializer_class
    2.generics.ListCreateAPIView -----> mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView 和get post方法
    3.generics.RetrieveUpdateDestroyAPIView -----> mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin, GenericAPIView 和 get put patch 和delete
    """
    
    
    class AuthorView(generics.ListCreateAPIView):
        queryset = Author.objects.all()
        serializer_class = AuthorModelSerializer
    
    
    class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
        queryset = Author.objects.all()
        serializer_class = AuthorModelSerializer
    视图

    三、一个视图CBV

    有两个视图的原因:有两个get方法

        path('author/', views.AuthorViewSet.as_view({'get': 'list', 'post': 'create'})),
        path('author/<pk>/', views.AuthorViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    路由
    from rest_framework import viewsets
    
    """
    重点:有两个视图CBV的原因,有两个get方法
    源码分析
    1.查找as_view(),并传递参数 {'get': 'list', 'post': 'create'}
    AuthorViewSet-->ModelViewSet-->GenericViewSet-->ViewSetMixin(找到as_view(传递参数action),返回值view, 找返回值)-->view()(找到view)
    
    for method, action in actions.items():    actions: {'get': 'list', 'post': 'create'}
        handler = getattr(self, action)     handler=self.list handler=self.create
        setattr(self, method, handler)    self.get=handler=self.list ->self.get=self.list
    
    返回 dispatch()
    
    2.查找 dispatch()
    AuthorViewSet-->ModelViewSet-->GenericViewSet-->generics.GenericAPIView-->views.APIView
    找到dispatch(self, request, *args, **kwargs)
    
    if request.method.lower() in self.http_method_names:  get 在 方法里
        handler = getattr(self, request.method.lower(),      get既是list 
                          self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    
    get找到list解决了 有两个list的问题
    """
    
    
    class AuthorViewSet(viewsets.ModelViewSet):
        queryset = Author.objects.all()
        serializer_class = AuthorModelSerializer
    视图
  • 相关阅读:
    hdu 6053 TrickGCD(筛法+容斥)
    hdu 6040 Hints of sd0061(stl: nth_element(arr,arr+k,arr+n))
    hdu 6055 Regular polygon
    POJ
    WPF页面后台代码InitializeComponent()报错
    C#更新packages
    git--撤销添加&放弃修改&代码冲突
    git--新建分支&提交代码
    foreach 改变集合时不能使用
    VirtualBox 共享文件夹设置
  • 原文地址:https://www.cnblogs.com/wt7018/p/11461742.html
Copyright © 2011-2022 走看看