码迷,mamicode.com
首页 > 其他好文 > 详细

序列化器

时间:2021-04-30 12:36:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:继承   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!