溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用ModelSerializer和Mixin

發(fā)布時(shí)間:2021-11-30 17:19:52 來源:億速云 閱讀:118 作者:小新 欄目:編程語言

這篇文章主要介紹如何使用ModelSerializer和Mixin,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

使用serializers.ModelSerializer

之前我們學(xué)了serializers模塊中Serializer類的使用,現(xiàn)在我們來學(xué)習(xí)一下如何使用Django中的serializers.ModelSerializer類替換之前的serializers.Serializer類
上一章我們是在Schools APP中的serializer.py中編寫的代碼吧,我們先看一下之前的代碼

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類吧

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')

如何使用ModelSerializer和Mixin

再來試一下序列化所有字段是什么樣子:fields = '__all__'

如何使用ModelSerializer和Mixin

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

使用mixins.ListModelMixin

mixins可以實(shí)現(xiàn)類功能或者函數(shù)功能增強(qiáng),能夠動態(tài)的增加函數(shù)的一些屬性和方法,DRF庫中有很多功能增強(qiáng)的mixin,

  • ListModelMixin:列表視圖擴(kuò)展類,提供list(request, args, *kwargs)方法快速實(shí)現(xiàn)列表視圖,返回200狀態(tài)碼,該Mixin的list方法會對數(shù)據(jù)進(jìn)行過濾和分頁;

  • GenericAPIView:繼承自APIVIew,增加了對于列表視圖和詳情視圖可能用到的通用支持方法,queryset為列表視圖的查詢集,serializer_class為視圖使用的序列化器;
    那現(xiàn)在我們編輯APP中的views.py文件, 重寫AllSchoolsView類

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

訪問接口的效果和之前是一眼的,但是代碼卻比未修改之前要少,我們來看一下

如何使用ModelSerializer和Mixin

使用generics.ListAPIView簡化AllSchoolsView

我們通過查看ListAPIView的繼承關(guān)系能夠看到ListAPIView繼承mixins.ListModelMixin和GenericAPIView:

class ListAPIView(mixins.ListModelMixin, GenericAPIView):

修改一下AllSchoolsView的繼承關(guān)系,我們發(fā)現(xiàn)如果讓AllSchoolsView繼承g(shù)enerics.ListAPIView,訪問接口的效果和之前也是一樣的,甚至可以省略get方法,
因?yàn)長istAPIView類自帶一個get方法,如此可以更加的簡潔代碼了。就不放效果圖了,和上面的圖一樣;

class AllSchoolsView(generics.ListAPIView):
    """
    這是AllSchoolsView的返回結(jié)果
    """
    # 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

如何使用ModelSerializer和Mixin

這里的規(guī)律是Create表示添加,Retrieve表示操作一條數(shù)據(jù),List表示操作多條數(shù)據(jù),Destroy表示刪除,Update表示更新。

  • ListCreateAPIView:用于post提交之后添加多條數(shù)據(jù)

  • RetrieveAPIView:用于返回一條數(shù)據(jù)

  • ListAPIView:用于返回一個表的數(shù)據(jù),或多條數(shù)據(jù)

  • CreateAPIView:添加一條數(shù)據(jù)

以上是“如何使用ModelSerializer和Mixin”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI