以前咱們學了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')
:
再來試一下序列化全部字段是什麼樣子:fields = '__all__'
函數
經過代碼咱們能夠得出結論,也就是使用serializers.ModelSerializer類
代替serializers.Serializer類
,也就是讓schools app中SchoolSerializer類繼承serializers.ModelSerializer類,可以讓代碼更加簡潔,也更加方便;post
mixins能夠實現類功能或者函數功能加強,可以動態的增長函數的一些屬性和方法,DRF庫中有不少功能加強的mixin,學習
那如今咱們編輯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
咱們經過查看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繼承
這裏的規律是Create表示添加,Retrieve表示操做一條數據,List表示操做多條數據,Destroy表示刪除,Update表示更新。