zoukankan      html  css  js  c++  java
  • rest_framework

    视图组件:视图组件用来优化接口逻辑

    1.使用视图组件的mixin进行接口的逻辑优化

      1.视图

    from rest_framework.generics import GenericAPIView
    
     from rest_framework.mixinx  import(
      ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin
    )
    导入序列化的类:
    from .app_serializers import BookSerializer
    class BookView(ListModelMixin,CreateModelMixin,GenericAPIView)
      queryset=Book.objects.all()
      serializer_class=BookSerializer
      def get(self,request,*args,*kwargs)
        renturn self.list(request,*args,*kwargs)
      def post(self,request,*args,*kwargs)
        return self,creat(request,*args,*kwargs)
    class BookFilterView(RetrievModelMixin,DestroyModelMixin,UpdateModelMixin,GenericAPIView)
      queryset=Book.objects.all()
      serializer_class=BookSerializer
      def get(self,request,*args,*kwargs)
        retyrn self.retrieve(request,*args,*kwargs)
      def put(self,request,*args,*kwargs)
        return self.unpate(request,*args,*kwargs)
      def delete(self,request,*args,*kwargs)
        return self.destroy(request,*args,*kwargs)

      2.定义一个序列化的类

    from rest_framework import serializers
    
    from .models import Book
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
    
            fields = ('title',
                      'price',
                      'publish',
                      'authors',
                      'author_list',
                      'publish_name',
                      'publish_city'
                      )
            extra_kwargs = {
                'publish': {'write_only': True},
                'authors': {'write_only': True}
            }
    
        publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
        publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
    
        author_list = serializers.SerializerMethodField()
    
        def get_author_list(self, book_obj):#必须使用get_方法
            # 拿到queryset开始循环 [{}, {}, {}, {}]
            authors = list()
    
            for author in book_obj.authors.all():
                authors.append(author.name)
    
            return authors

      3.URL

     re_path(r'books/$', views.BookView.as_view()),
     re_path(r'books/(?P<pk>d+)/$', views.BookFilterView.as_view()),

    2.使用视图组件的View来对接口进行逻辑优化

      1.view

    1.导入模块:
    from rest_framework import generise
    2.书写视图
    class BookView(generise.ListCreateAPIView)
      qyeryset=Book.object.all()
      serializer_class=BookSerializer

     class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
       queryset = Book.objects.all()
       serializer_class = BookSerializer

      2.url

    re_path(r'books/$', views.BookView.as_view()),
    re_path(r'books/(?P<pk>d+)/$', views.BookFilterView.as_view()),

    3.使用组件的Viewset对接口进行逻辑优化

    个人理解:

    导入的ModelViewSet中封装了

    class ModelViewSet(mixins.CreateModelMixin,
    mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    mixins.ListModelMixin,
    GenericViewSet):

      1.view

    1.导入模块
    from rest_framework.viewsets imoprt ModelViewSet
    2.书写视图
    class BookView(ModelViewSet)
      queryset=Book.objects.all()
      serializer_class=BookSerializer

      2.设计URL

    re_path(r'books/$',views.BookView.as_view({
      'get':'list',
      'post':'create'
    }))

    re_path(r'books/?P<pk>d+/$'),views.BookView.as_view({
      'get':'retrieve',
      'de;eta':'destroy',
      'put':'update'
    })
  • 相关阅读:
    Java-23,final关键字
    Java-22,抽象类
    Java-21,多态的三个条件
    Java-20,object类之equals方法
    面试题
    平时碰到系统CPU飙高和频繁GC,你会怎么排查?
    django中的FBV和CBV
    flask + celery实现定时任务和异步
    python面试题大全
    Apollo配置中心介绍
  • 原文地址:https://www.cnblogs.com/wqzn/p/10083918.html
Copyright © 2011-2022 走看看