from rest_framework import serializers
class BookSerlizer(serializers.Serializer):
title = serializers.CharField()
price = serializers.IntegerField()
pub_date = serializers.DateField()
# source 可以指定一个字段也可以指定一个方法
publish = serializers.CharField(source=‘publish.name‘)
# 获取作者所有的信息,指定SerializerMethodField之后,可以对应一个方法,返回什么内容,authors就是什么内容
authors = serializers.SerializerMethodField(read_only=True)
# 对应的方法固定写法get_字段名
def get_authors(self, obj):
author_ser = AuthorSerlizer(obj.authors.all(), many=True)
return author_ser.data
class BookSerializer(serializers.ModelSerializer):
class Meta:
model=models.Book
# fields=(‘nid‘,‘name‘)
#不能跟fields同时使用
# exclude=[‘name‘,]
fields=(‘__all__‘)
#深度是1,官方建议不要超过10,个人建议不要超过3
# depth=1
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret=AuthorSerializer(instance=obj.authors.all(),many=True)
return ret.data
name=serializers.CharField()
class Books(APIView):
def get(self, request):
back_dic = {
‘code‘: 100,
‘msg‘: ‘查询成功‘,
}
# 获取所有的图书数据
books = models.Book.objects.all()
# print(books)
# 序列化数据,many为True序列化多条数据,false序列化一条数据
# instance 序列化,data 反序列化
book_ser = BookSerlizer(instance=books, many=True)
# print(book_ser)
# 获取序列化后的数据
back_dic[‘data‘] = book_ser.data
print(back_dic)
return Response(back_dic)
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
book_name = serializers.CharField(source=‘book‘)
price = serializers.CharField()
# 指向字段名
publish = serializers.CharField(source=‘publish.name‘)
class BookSerializer(serializers.ModelSerializer):
# 指向方法
book_type =serializers.CharField(source=‘get_xx_display‘,read_only=True)
-序列化的两种方式 -Serializers:没有指定表模型 -source:指定要序列化哪个字段,可以是字段,可以是方法 - SerializerMethodField的用法 authors=serializers.SerializerMethodField() def get_authors(self,obj): ret=AuthorSerializer(instance=obj.authors.all(),many=True) return ret.data -ModelSerializers:指定了表模型 class Meta: model=表模型 #要显示的字段 fields=(‘__all__‘) fields=(‘id‘,‘name‘) #要排除的字段 exclude=(‘name‘) #深度控制 depth=1
-重写某个字段
在Meta外部,重写某些字段,方式同Serializers
def create(self, validated_data):
# print(‘1‘,validated_data)
publish = validated_data.pop(‘publish‘)
publish_obj = models.Publish.objects.filter(name=publish[‘name‘]).first()
# print(publish_obj)
validated_data[‘publish‘] = publish_obj
res = models.Book.objects.create(**validated_data)
return res
def post(self, request):
back_dic = {
‘code‘: 100,
‘msg‘: ‘‘,
}
# 反序列化传入data
book_ser = BookSerlizer(data=request.data)
# print(‘1‘,request.data)
# 校验数是否合法
print(book_ser.is_valid())
# print(book_ser.errors)
if book_ser.is_valid():
print(book_ser.validated_data)
book_ser.create(book_ser.validated_data)
back_dic[‘data‘] = book_ser.validated_data
back_dic[‘msg‘] = ‘新增成功‘
# print(back_dic)
return Response(back_dic)
def post(self,request):
bookser=BookSerializer(data=request.data)
if bookser.is_valid():
ret=bookser.save()
return Response()
def validate_name(self,value):
print(value)
if value.startswith(‘sb‘):
raise exceptions.ValidationError(‘不能以sb开头‘)
return value
def validate(self,attrs):
print(attrs)
if attrs.get(‘price‘)!=attrs.get(‘xx‘):
raise exceptions.ValidationError(‘name和price相等,不正常‘)
return attrs
原文:https://www.cnblogs.com/girls/p/12896399.html