序列化常用字段
charField
BooleanField
IntegerField
DecimaField
# ListField:{name:'summer',hobby:[1,2,3,4]}
# DictField:{nane:'summer',wife:{'name':'哈哈哈'}}
常用字段参数
给charField用的参数:max_length 最大长度
min_length 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
给IntegerField用的参数:max_value 最大值 min_value 最小值
# 通用字段
read_only 表示该字段只用作序列化 read_only=true
write_only 表示只用作反序列化 write_only=true
required 表明该字段在反序列化时必须输入,默认为True
error_messages 错误信息提示的字典
default 反序列化时使用的默认值
label 用于HTML展示API页面时,显示的字段名称
序列化高级用法之source
source:1.用于字段名的修改 (在哪个字段修改就是改哪个字段的名字)
# 让name字段在前端显示的时候叫bookname
bookname = serializers.CharField(max_length=32,source='name')
2.修改方法的名字
3.可以用作表查询
代码展示
class BookSerializer(serializers.Serializer):
name_detail = serializers.CharField(max_length=8, min_length=3,source='name')
# 或
publish_name = serializers.CharField(max_length=8, min_length=3,source='publish.name')
# 或
xx = serializers.CharField(max_length=8, min_length=3,source='xx') #source的xx表示表模型中得方法
定制序列化的方式
方式一
方式1:serializerMethodField()
publish_de = serializers.SerializerMethodField()
必须配合一个方法 get_字段名,需要加一个参数
def get_book(self,obj):
return 该方法返回的是什么 这个字段就是什么
代码实例: return {'name': obj.publish.name, 'city': obj.publish.city, 'email': obj.publish.email}
方式二
方式2: 在表模型中写方法
表模型: def publish_detail(self):
return {} 返回的什么类型 就用什么类型的字段接收
代码实例:return {'name': self.publish.name, 'city': self.publish.city, 'email': self.publish.email}
序列化py文件:publish_detail = serializers.DictField()
反序列化之多表关联数据
新增
1.多表关联数据新增
def create(self, validated_data):
book = Book.objects.create(
name=validated_data.get('name'),
price=validated_data.get('price'),
publish_id=validated_data.get('publish'),
publish_date=validated_data.get('publish_date') )
authors = validated_data.get('author') # 第三张表
book.author.add(*authors)
return book
修改
# 数据修改
def update(self, instance, validated_data):
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
instance.publish_date = validated_data.get('publish_date')
instance.publish_id = validated_data.get('publish')
instance.author.set(validated_data.get('author'))
instance.save()
return instance
模型类序列化器ModelSerializer的使用
# 与Serializer最大的区别就是不需要重写create方法和update方法,不需要写字段
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = Book # 这里是需要序列化的模型类
fields = ['name', 'price', 'publish_date', 'publish', 'publish_detail']
# 需要序列化的字段名
extra_kwargs = {
'name': {'max_length': 8, 'min_length': 3, 'error_messages': {'min_length': "太短了"}},
'price': {'max_value': 199, 'min_value': 60, 'error_messages': {'min_value': "不能再便宜了!"}},
'publish_detail': {'read_only': True},
}
还可以在extra_kwargs内给需要校验的字段增加更多的属性
模型类总结
模型类总结:
1.定义一个类继承ModelSerializer
2.类内部定义class Meta:
3.在内部类中指定model(要序列化的表)
4.在内部类中指定fields(可以直接写__all__表示所有字段都有序列化,用[内写需要序列化的字段])
5.在内部类中指定extra_kwargs,给字段添加参数的
6.在序列化类中,可以重写某个字段,优先使用重写的字段
name = serializers.SerializerMethodField()
def get_name(self, obj):
return 'sb---' + obj.name
7.不需要写create方法和update方法,任意表都可以直接存
反序列化的字段校验
字段参数的校验
1.字段自己的校验规则 在serializer.py
继承的是Serializer:
price = serializers.IntegerField(max_value=100, min_value=32)
继承的是ModelSerializer
extra_kwargs = {
'price': {'max_value': 199, 'min_value': 60, 'error_messages': {'min_value': "不能再便宜了!"}}
}
局部钩子
2.局部校验 继承的类方法都一样
def validate_name(self, name):
if name.startswith('sb'):
raise ValidationError('名字中不可以带傻逼!')
return name
全局钩子
3.全局校验 (一般没有密码校验的话用的很少)
def validate(self, attrs):
if attrs.get('name') == attrs.get('publish_date'):
raise ValidationError('名字不能等于日期')
else:
return attrs
标签:name,get,publish,length,序列化,data,ModelSerialize,drf
From: https://www.cnblogs.com/Hsummer/p/16736488.html