ModelSerializer
1.减小序列化类代码
2.不需要重写update,create
ser.py
class BookModelSerializer(serializers.ModelSerializer):class Meta:model=Bookfields='__all__' #序列化全部字段# fields=('name','price') # 序列化指定字段# exclude=('name',) # 与fields 不能共用 用于排除某个字段
views.py 书写格式与原来一样,只修改方法名字。
class BooksView2(APIView):def get(self, request):response=MyResponse()books = Book.objects.all()book_ser = BookModelSerializer(books, many=True) # 序列化多条。 如果一条,不需要写response.data = book_ser.datareturn Response(response.get_dic)def post(self, request):response=MyResponse()# 新增没有instance,只有databook_ser = BookModelSerializer(data=request.data)# 如果没有data=,会报错。第一个参数是instance# book_ser = BookSerializer(request.data)# 校验字段if book_ser.is_valid():book_ser.save()response.data = book_ser.dataelse:response.status = 102response.msg = '新增数据校验失败'response.data = book_ser.datareturn Response(response.get_dic)
高级用法
source
1.可以该字段名
title_name=serializers.CharField(source='title')
2.可以用"."进行跨表
# 调用 book.publish,直接.publish,所以需要Publish里定义 __str__方法
publish=serializers.CharField()# 可以理解source 隐藏book.字段。publish = serializers.CharField(source='publish.email')
3.可以执行方法
# test为book类里定义的方法
title=serializers.CharField(source='test')
SerializerMethodField()
需要配套方法,方法名叫 get_字段名 返回值就是要显示的东西
# 需要配套方法,方法名叫 get_字段名 返回值就是要显示的东西authors=serializers.SerializerMethodField()def get_authors(self,instance):# book 对象authors=instance.authors.all()ll=[]for author in authors:ll.append({'name':author.name,'age':author.age})return ll