序列化器的各个字段以及字段内属性

字段表格:

BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(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: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)

通用字段属性

read_only 表明该字段只会在返回数据的时候起到作用,并不会在写入数据的时候起到作用,默认False
write_only 表明该字段只会在往数据库输入的时候起到作用,并不会在返回数据的时候将该字段数据返回,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 可以使用该属性进行数据校验,为该属性传入的是一个列表,列表内放入函数的内存地址
error_messages 包含错误编号与错误信息的字典
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息

非通用属性

max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值

drf序列化器的全局钩子与局部钩子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
局部钩子,validate_字段名,必须要有data,data就是form组件的clean_data
def validate_title(self, data):
if data.startswith('sb'):
raise ValidationError('不能以sb开头')
else:
return data

全局钩子,attrs就是form组件的clean_data
def validate(self, attrs):
title=attrs.get('title')
publish=attrs.get('publish')
if title==publish:
raise ValidationError('书名不能跟出版社同名')
else:
return attrs


validators 字段中指定特定函数去处理检测
publish = serializers.CharField(max_length=32,validators=[check,])
def check(data):
if len(data)>10:
raise ValidationError('最长不能超过10')
else:
return data

序列化器的高级使用

1.source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.可以通过source与models中的字段进行映射关系,这样我们可以任意取名,为返回的数据命名
book_name = serializers.CharField(min_length=3, max_length=32,source='name')

2.与models中的任意方法进行映射
我们可以创建任意一个不存在的字段,与models中的任意函数进行映射
序列化器中
name_price = serializers.CharField(source='add')

models中:
def add(self):
return self.name + str(self.price)

3.支持跨表查询数据
publish_addr = serializers.CharField(max_length=32 , source='publish.addr')

2.SerializerMethodField

1
2
3
使用该字段后,你可以在下面写一个方法与该字段进行绑定,下面的方法的返回值就是你这个字段要被序列化,反序列化的值
#命名规范
def get_字段名(self,obj) #obj是必须要有的,obj为你这个类绑定的表的 对象

模型类序列化器

ModelSerilizer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Book(serializers.ModelSerializer):
class Meta:
model = models.Book #与model中的哪个表进行关联
fields = '__all__' #将哪些字段进行序列化或反序列化__all__是指全部序列化
exclude = [字段] #除了哪些字段都进行序列化以及反序列化,不能跟fields同时使用
read_only_fields = [字段] #只读与之前的read_only一样
write_only_fields = [字段] #只写
extra_kwargs = {字段:{属性}} eg:{'title':{'max_length':32,'write_only':True}}
depth = 1 #跨表查询,将另外一张与该表有关表的数据全部查出

新增与修改
不需要重写create与update方法,在ModelSerializer以及进行了重写

ps:值得注意的是,使用该序列器并对表进行关联后,当你调用is_valid()方法后,他会去帮助你检验数据库中的校验规则,比如用户名必须唯一等