以前咱们学了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表示更新。