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'
})
原文地址:https://www.cnblogs.com/wqzn/p/10083918.html