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'
    })
  • 相关阅读:
    妙用sql的统计进行集合的比较
    kissy学习笔记(1)上手kissy
    Ext与现有项目的结合(一)完全封装已有的HTML元素使之成为Ext的组件
    Fix IE6 剪贴板撤销机制CtrlZ,CtrlY功能会在由于Js动态改变页面元素的value后失效的Problem
    Ajax个人开发心得(一)先从一个最简单的ajax功能模块说起,Ajax技术其实很简单
    【转】仅用 []()+! 就足以实现几乎任意Javascript代码
    为什么不用13px字体
    Ajax个人开发心得(二)页面逻辑与页面表现的分离,让你的Ajax编程更加模块化
    纯JS转换Select为Combox,完美实现原select所有功能
    关于window.parent的奇怪问题
  • 原文地址:https://www.cnblogs.com/wqzn/p/10083918.html
Copyright © 2011-2022 走看看