常用字段类
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}}
常用字段参数
max_length:最长长度
min_length:最短长度
allow_blank:是否允许为空,drf进行反序列化输入时才有效
trim_whitespace:是否截断空白字符
max_value:最小值
min_value:最大值
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
序列化
两种方式:
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()
def get_publish(self, 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):
class Meta:
model = Book
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