DRF Django REST framework 之 視圖組件(四)

引言

在咱們有幾十上百的視圖類,都有get,post等方法,在功能相似時,會致使大量的重複代碼出現,顯然還有不少能夠優化的地方。這也就有了視圖組件,它的功能很是強大,能很好的優化接口邏輯。程序員

視圖組件

使用視圖組件的mixin優化接口邏輯

  1. 導入 mixins 
  2. 定義序列化類
  3. 定義視圖類
# 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

使用視圖組件的view優化接口邏輯

  1. 導入 generics 
  2. 導入序列化類
  3. 定義視圖類

對 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 。優化

使用視圖組件的viewset優化接口邏輯

看似已經優化的很是完美了,可是在一個對性能要求極高的項目裏面,咱們的程序還能夠繼續優化,不斷的優化程序是每一個程序員必備的技能。url

  1. 定義 url 
  2. 導入 viewset 
  3. 導入序列化類
  4. 定義視圖類

注意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

相關文章
相關標籤/搜索