DRF之序列化类

常用字段类

CharField:CharField(max_length=None, min_length=None, allow_blank=False)
BooleanField:BooleanField()
IntegerField:IntegerField(max_value=None, min_value=None)
DecimalField:DecimalField(max_digits, decimal_places,coerce_to_string=None,max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
        
        
还有重点记两个:
ListField:{'name': 'lqz', 'age': 19, 'hobby': ['篮球', '足球']}
DictField:{'name': 'lqz', 'age': 19, 'wife': {'name': '刘亦菲', 'age': 33}}

常用字段参数

# 给CharField字段类使用的参数
max_length:最长长度
min_length:最短长度
allow_blank:是否允许为空,drf进行反序列化输入时才有效
trim_whitespace:是否截断空白字符

# 给IntegerField字段类使用的参数
max_value:最小值
min_value:最大值

# 给DateTimeField字段类型使用的参数
DateTimeField指定auto_now_add=True,在创建一条记录时会自动创建时间作为该字段的值,后续更新不会改变该值
DateTimeField指定auto_now=True,在更新一条记录时,会自动将更新记录的时间作为该字段的值

# 通用参数
required:表明该字段在反序列化的时候必须输入
default:反序列化时使用的默认值
allow_null:表明该字段是否允许传入None,默认False
validators:该字段使用的验证器
error_messages:包含错误标号与错误信息的字典
lable:用来HTML展示API页面时,显示的字段名称
help_text:用于HTML展示API页面时,显示的字段帮助提示信息

# 重点参数
read_only:表示该字段仅用于序列化输出,默认Flase
write_only:表示该字段仅用于反序列化输入,默认为Flase

序列化高级用法之source

作用:可以将字段或方法重命名,也可以做跨表查询(但是用的很少)

如何使用:
	source是一个字段参数,使用的时候指定序列化表中的字段名即可
    eg:
        book_name = serializers.CharField(max_length=8, min_length=3,source='name')
        就可以将字段名改为book_name,在展示的时候,就会显示的是book_name

序列化

# 继承的是serializers.serializer

两种方式:

1.在序列化类中

当我们使用serializerMethodField的时候,必须配合一个方法,该方法返回什么,该字段就得到什么
get_xxx(self,obj)
obj是该当前序列化的对象

class Bookerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8, min_length=3)
    price = serializers.IntegerField(max_value=100, min_value=10)
    publish_date = serializers.DateField()
    publish = serializers.SerializerMethodField()  # 必须配合一个方法(get_字段名,需要接受一个参数),返回什么,publish就接收到什么
    def get_publish(self, obj)  # 这里的obj就是当前序列化的对象
    	return {'name': obj.publish.name,.....}


2.在表模型中:

在表字段后面加上一个方法,该方法用来返回要序列化的数据,该方法可以包装成属性,也可以不包装
该方法用的是self为当前序列化的对象
在序列化类中使用是:
表模型中的方法名 = serializers.Field类型(返回字典格式用DictField)()

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField(null=True)
    
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Author')
    
    def publish_detail(self):
        return {'name': self.publish.name,......}
    
在序列化类中:
	publish_detail = serializers.DictField(read_only=True)


    
用于序列化的时候,将模型类对象传入instance参数
用于反序列化的时候,将要被反序列化的数据传入data参数
除了instance和data参数以外,在创建serializer对象时,还可以通过context参数额外添加数据

反序列化:

1.现在视图层写post新增数据

2.在序列化类中重写create方法

def create(self, validated_data):
    book = Book.object.create(name=validated_data.get('name')
                             ......)
    authors = validated_data.get('authors')
    book.authors.add(*authors)
    return book

还需要在序列化类中加上表模型上的外键字段,你选择结果的字段

还要序列化和反序列化还要分别写两个字段,序列化用read_only=True,反序列化用write_only=True

使用ModelSerizers来序列化

1.在表模型中使用
class Meta:
	model = 要序列化关联的表名
    fields = 要序列化的字段,如果想要所有的话,就写'__all__'
    extra_kwargs = 可以给字段新增参数
    
如果们不想用fields来序列化,我们可以自己写序列化字段

【序列化类中】
class BookModelSerializer(serializers.ModelSerializer):  # ModelSerializer也是继承Serializer
    class Meta:
        model = Book
        # field = '__all__'  # 所有的字段都序列化
        field = ['name', 'price', 'publish_date', 'publish', 'authors', 'publish_detail', 'authors_list']  # 列表中有哪些字段,就序列化哪些字段
        extra_keargs = {  # 可以给字段添加参数
            'name': {'max_length': 8},
            'publish': {'write_only': True},
            'authors': {'write_only': True},
        }
        
        publish_detail = serializers.SerializerMethodField(read_only)
        def get_publish(self, obj):
            pass
        authors_list = serializers.SerializerMethodField(read_only)
        def get_authors(self, obj)pass

数据校验之数据钩子

字段有自己的校验规则
如果继承的时Serializer,写法如下:
	name=serializer.CharField(max_length=8, min_length=3,error_messages={'min_length':'太短了'})
如果继承的是ModelSerializer,写法如下:
	extra_kwargs = {
        'name':{'max_length':8,'min_length':3,'error_messages':{'min_length':'太短了'}}
    }
    
    
    
局部钩子
	def validate_name(self, name):
        if name.startswith('sb'):
            raise ValidationError('不能以sb开头')
        else:
            return name
        
        
       
全局钩子
	def validate(self, attrs):
        if attrs.get('name') == 'jason':
            raise ValidationError('名字不能等于jason')
        else:
            return attrs
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值