视图组件:视图组件用来优化接口逻辑
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'
})