在咱們有幾十上百的視圖類,都有get,post等方法,在功能相似時,會致使大量的重複代碼出現,顯然還有不少能夠優化的地方。這也就有了視圖組件,它的功能很是強大,能很好的優化接口邏輯。程序員
# 1.導入mixins from rest_framework.mixins import ( ListModelMixin, CreateModelMixin, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin ) from rest_framework.generics import GenericAPIView from DrfOne import models # 2.定義序列化類 from DrfOne.drf_serializers import BookSerializer # 3.定義視圖類 class BookView(ListModelMixin, CreateModelMixin, GenericAPIView): # 獲取數據源, 固定寫法 queryset = models.Book.objects.all() # 序列化類, 固定寫法 serializer_class = BookSerializer 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 BookFilterView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView): # 獲取數據源, 固定寫法 queryset = models.Book.objects.all() # 序列化類, 固定寫法 serializer_class = BookSerializer 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)
定義序列化類django
from rest_framework import serializers from DrfOne import models class BookSerializer(serializers.ModelSerializer): class Meta: model = models.Book fields = "__all__" extra_kwargs = { # 僅寫 "publish": {'write_only': True}, "authors": {'write_only': True}, } publish_name = serializers.CharField(max_length=32, read_only=True, source="publish.name") publish_address = serializers.CharField(max_length=32, read_only=True, source="publish.address") author_name = serializers.SerializerMethodField() def get_author_name(self, book_obj): author_list = list() for author in book_obj.authors.all(): # 注意列表添加字段,author.name而不是author author_list.append(author.name) return author_list
注意:操做單條數據的 url app
from django.urls import path, re_path from DrfOne import views urlpatterns = [ path('books/', views.BookView.as_view()), # 須要命名爲pk re_path("books/(?P<pk>\d+)/", views.BookFilterView.as_view()), ]
經過上面代碼發現 get , post 等方法內容類似,能夠進行再次封裝。post
對 mixins 再次優化其他內容不變性能
# 1.導入generics from rest_framework import generics from DrfOne import models # 2.導入序列化類 from DrfOne.drf_serializers import BookSerializer # 3.定義視圖類 class BookView(generics.ListCreateAPIView): # 獲取數據源, 固定寫法 queryset = models.Book.objects.all() # 序列化類, 固定寫法 serializer_class = BookSerializer class BookFilterView(generics.RetrieveUpdateDestroyAPIView): queryset = models.Book.objects.all() serializer_class = BookSerializer
發現仍是有重複代碼,再次優化,也就是 viewset 。優化
看似已經優化的很是完美了,可是在一個對性能要求極高的項目裏面,咱們的程序還能夠繼續優化,不斷的優化程序是每一個程序員必備的技能。url
注意urls.py的變化spa
from django.urls import path, re_path from DrfOne import views urlpatterns = [ # path('books/', views.BookView.as_view()), # re_path("books/(?P<pk>\d+)/", views.BookFilterView.as_view()), path("books/", views.BookView.as_view({ "get": "list", "post": "create", })), re_path('books/(?P<pk>\d+)/', views.BookView.as_view({ 'get': 'retrieve', 'put': 'update', 'delete': 'destroy' })), ]
views.pyrest
# 2.導入viewset模塊裏的ModelViewSet類 from rest_framework.viewsets import ModelViewSet # 導入應用裏的models from DrfOne import models # 3.導入序列化類 from DrfOne.drf_serializers import BookSerializer # 4.定義視圖類 class BookView(ModelViewSet): # 獲取數據源, 固定寫法 queryset = models.Book.objects.all() # 序列化類, 固定寫法 serializer_class = BookSerializer
~>.<~code