這篇文章主要介紹如何使用ModelSerializer和Mixin,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供綿陽機房托管,高防服務(wù)器,成都IDC機房托管,成都主機托管等互聯(lián)網(wǎng)服務(wù)。
之前我們學(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')
:
再來試一下序列化所有字段是什么樣子:fields = '__all__'
通過代碼我們可以得出結(jié)論,也就是使用serializers.ModelSerializer類
代替serializers.Serializer類
,也就是讓schools app中SchoolSerializer類繼承serializers.ModelSerializer類,能夠讓代碼更加簡潔,也更加方便;
mixins可以實現(xiàn)類功能或者函數(shù)功能增強,能夠動態(tài)的增加函數(shù)的一些屬性和方法,DRF庫中有很多功能增強的mixin,
ListModelMixin:列表視圖擴展類,提供list(request, args, *kwargs)方法快速實現(xiàn)列表視圖,返回200狀態(tài)碼,該Mixin的list方法會對數(shù)據(jù)進行過濾和分頁;
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)
訪問接口的效果和之前是一眼的,但是代碼卻比未修改之前要少,我們來看一下
我們通過查看ListAPIView的繼承關(guān)系能夠看到ListAPIView繼承mixins.ListModelMixin和GenericAPIView:
class ListAPIView(mixins.ListModelMixin, GenericAPIView):
修改一下AllSchoolsView的繼承關(guān)系,我們發(fā)現(xiàn)如果讓AllSchoolsView繼承g(shù)enerics.ListAPIView,訪問接口的效果和之前也是一樣的,甚至可以省略get方法,
因為ListAPIView類自帶一個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
這里的規(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!