ModelSerializer 和 Mixin的使用

使用serializers.ModelSerializer

以前咱們學了serializers模塊中Serializer類的使用,如今咱們來學習一下如何使用Django中的serializers.ModelSerializer類替換以前的serializers.Serializer類
上一章咱們是在Schools APP中的serializer.py中編寫的代碼吧,咱們先看一下以前的代碼html

from rest_framework import serializers
from .models import School
class SchoolSerializer(serializers.Serializer):
    name = serializers.CharField()
    desc = serializers.CharField()
    location = serializers.CharField()
    create_time = serializers.DateTimeField(default=datetime.now,)
    course_numbers = serializers.IntegerField()
    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return School.objects.create(**validated_data)

咱們定義了一個SchoolSerializer類,繼承了serializers.Serializer類,而後在其中定義了5個字段對吧,那咱們來看一下如何把serializers.Serializer類替換成serializers.ModelSerializer類吧app

class SchoolSerializer(serializers.ModelSerializer):
  
    class Meta:
        # 指定須要序列化的Model
        model = School    
        # 指定須要序列化的Model中的字段
        fields = ('name', 'desc')
    
        # 序列化全部的字段
        fields = '__all__'
    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return School.objects.create(**validated_data)

看上面代碼能夠看出,可使用fields指定須要序列化的Model中的字段,能夠指定一個、兩個..或者全部字段,若是咱們要指定序列化全部字段咱們可使用fields = '__all__'
咱們先來看一下若是序列化兩個字段是什麼樣子 fields = ('name', 'desc')
1.png
再來試一下序列化全部字段是什麼樣子:fields = '__all__'函數

2.png

經過代碼咱們能夠得出結論,也就是使用serializers.ModelSerializer類代替serializers.Serializer類,也就是讓schools app中SchoolSerializer類繼承serializers.ModelSerializer類,可以讓代碼更加簡潔,也更加方便;post

使用mixins.ListModelMixin

mixins能夠實現類功能或者函數功能加強,可以動態的增長函數的一些屬性和方法,DRF庫中有不少功能加強的mixin,學習

  • ListModelMixin:列表視圖擴展類,提供list(request, args, *kwargs)方法快速實現列表視圖,返回200狀態碼,該Mixin的list方法會對數據進行過濾和分頁;
  • GenericAPIView:繼承自APIVIew,增長了對於列表視圖和詳情視圖可能用到的通用支持方法,queryset爲列表視圖的查詢集,serializer_class爲視圖使用的序列化器;

那如今咱們編輯APP中的views.py文件, 重寫AllSchoolsView類spa

class AllSchoolsView(mixins.ListModelMixin,generics.GenericAPIView ):
    """
    這是AllSchoolsView的返回結果
    """
    # queryset、serializer_class是固定的
    queryset = School.objects.all()
    serializer_class = SchoolSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

訪問接口的效果和以前是一眼的,可是代碼卻比未修改以前要少,咱們來看一下 rest

3.png

使用generics.ListAPIView簡化AllSchoolsView

咱們經過查看ListAPIView的繼承關係可以看到ListAPIView繼承mixins.ListModelMixin和GenericAPIView:code

class ListAPIView(mixins.ListModelMixin, GenericAPIView):

修改一下AllSchoolsView的繼承關係,咱們發現若是讓AllSchoolsView繼承generics.ListAPIView,訪問接口的效果和以前也是同樣的,甚至能夠省略get方法,
由於ListAPIView類自帶一個get方法,如此能夠更加的簡潔代碼了。就不放效果圖了,和上面的圖同樣;htm

class AllSchoolsView(generics.ListAPIView):
    """
    這是AllSchoolsView的返回結果
    """
    # queryset、serializer_class是固定的
    queryset = School.objects.all()
    serializer_class = SchoolSerializer
    # def get(self, request, *args, **kwargs):
        # return self.list(request, *args, **kwargs)

在rest_framework庫下的generics.py中有不少封裝好的View繼承

4.png

這裏的規律是Create表示添加,Retrieve表示操做一條數據,List表示操做多條數據,Destroy表示刪除,Update表示更新。

  • ListCreateAPIView:用於post提交以後添加多條數據
  • RetrieveAPIView:用於返回一條數據
  • ListAPIView:用於返回一個表的數據,或多條數據
  • CreateAPIView:添加一條數據

參考:https://www.9xkd.com/user/plan-view.html?id=1234261449

相關文章
相關標籤/搜索