标签:继承 get validator default framework tail auth 列表 object
序列化:把python中的对象转成json格式字符串
反序列化:把json格式字符串转成python中的对象
drf的序列化组件(序列化器):把对象转成字典。因为有字典,直接丢到Response中就可以了
1 写一个序列化的类,继承Serializer
2 在类中写要序列化的字段
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 在这里写要序列化的字段
# 序列化字段类(有很多,常用的就几个,等同于models中的字段类)
# 字段类,有很多字段参数()
# 字段参数:source,指定要序列化表中的哪个字段。只有一个字段(也可以跨表)
# 不指定,默认就是字段名,必须跟数据库对应
# 指定了source就可以给字段改名了
name = serializers.CharField()
price = serializers.IntegerField()
publish = serializers.CharField()
3 在视图类中使用(实例化)
from rest_framework.views import APIView
class BookView(APIView):
book_list = models.Book.objects.all()
# instance=None, 要序列化的数据
# many=True 如果序列化多条,一定要写many=True
book_ser = BookSerializer(instance=book_list, many=True)
4 得到序列化后的数据,返回
book_ser.data
# 针对charfield
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
# 针对interfield
max_value 最小值
min_value 最大值
# 通用的,大家都有
# 这两个最重要
read_only 表明该字段仅用于序列化输出,默认False(序列化)
write_only 表明该字段仅用于反序列化输入,默认False(反序列化)
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
error_messages 包含错误编号与错误信息的字典
validators 该字段使用的验证器(了解)
# 方法一:SerializerMethodField
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
name = serializers.CharField()
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
print(obj)
# return {‘name‘:‘sss‘,‘city‘:‘sss‘}
return {‘name‘:obj.publish.name,‘city‘:obj.publish.city}
# 方法二:在模型表中写方法
# 表模型中写的
def publish_name(self):
return {‘name‘:self.publish.name,‘city‘:self.publish.city}
@property
def author_list(self):
return [
{‘name‘:author.name,‘age‘:author.age,‘id‘:author.nid}
for author in self.authors.all()
]
#序列化类中
publish = serializers.CharField(source=‘publish_name‘)
publish_name = serializers.DictField()
author_list = serializers.ListField()
如果要反序列化,继承了Serializer,必须重写create方法
# 使用
# 视图类
def post(self, request):
publish_ser = serializer.PublishSerializer(data=request.data)
if publish_ser.is_valid():
# 直接保存,保存到哪个表里?需要重写save
publish_ser.save()
return Response(publish_ser.data)
else:
print(publish_ser.errors)
return Response(‘数据有问题啊‘)
# 序列化类
def create(self, validated_data):
res = models.Publish.objects.create(**validated_data)
return res
# 局部钩子:validate_字段名
def validate_name(self, data):
# data就是当前字段的值
if data.startswith(‘sb‘):
raise ValidationError(‘不能以sb开头‘)
else:
return data
# 全局钩子
def validate(self, attrs):
if attrs.get(‘name‘) == attrs.get(‘city‘):
raise ValidationError(‘city和名字不能一样‘)
else:
return attrs
from rest_framework import serializers
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book # 选择表模型
fields = ‘__all__‘ # 选择范围
# 部分字段添加参数
extra_kwargs = {
‘publish‘: {‘required‘: True, ‘write_only‘: True},
‘authors‘: {‘required‘: True, ‘write_only‘: True},
}
# 一些需要跨表的字段
publish_detail = PublishSerializer(source=‘publish‘,read_only=True)
author_list=serializers.ListField(read_only=True)
# 添加字段自己的校验,全局钩子,局部钩子
标签:继承 get validator default framework tail auth 列表 object
原文地址:https://www.cnblogs.com/shof/p/14720690.html