ModelSerializer可以根据指定的模型类,自动生成相应的序列化器字段,继承Serializer的时候所有方法是手写,现在使用继承ModelSerializer,不用手写模型类里的每个字段限制
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = BookInfo # 指定生成字段的模型类
fields = ('btitle', 'bread') # 指定模型类中的字段
第一步 指定模型类
第二步使用fields属性
1、fields = ('btitle', 'bread') # 指定模型类中的字段,这种常用
2、如果想生成所有字段
fields = '__all__' 就会生成模型类中的所有字段
3、如果想取反操作
exclude =('btitle',) # 取反操作,除了这个字段外的其他字段都生成
验证方式
python manage.py shell 进入django交互环境
from book_drf.serializer import BookModelSerializer
BookModelSerializer()
可以看出自动帮我们生成了校验值,但是有些值不太符合我们要求
如果想修改字段限制,有两种方式
第一种、显示指明字段
class BookModelSerializer(serializers.ModelSerializer):
# 显示指明字段,
bread = serializers.IntegerField(max_value=100, min_value=20)
sms_code = serializers.CharField(max_length=6, min_length=6)
class Meta:
model = BookInfo # 指定生成字段的模型类
# fields = ('btitle', 'bread') # 指定模型类中的字段
# fields = '__all__' # 指定模型类中的字段
exclude =('btitle',) # 取反操作,除了这个字段外的其他字段都生成
每次修改完,如果想看修改结果,需要重新退出进入python manage.py shell。
显示指明字段也可以,新增没有的字段,例如新增一个sms_code字段
class BookModelSerializer(serializers.ModelSerializer):
# 显示指明字段,
bread = serializers.IntegerField(max_value=100, min_value=20)
sms_code = serializers.CharField(max_length=6, min_length=6)
class Meta:
model = BookInfo # 指定生成字段的模型类
# fields = ('btitle', 'bread') # 指定模型类中的字段
# fields = '__all__' # 指定模型类中的字段
exclude =('btitle',) # 取反操作,除了这个字段外的其他字段都生成
第二种方式,使用extra_kwargs,也可以对已有的字段进行修改,或者新增没有的字段校验
class BookModelSerializer(serializers.ModelSerializer):
# 显示指明字段,可以指明已有的字段,还可以指明没有的字段
bread = serializers.IntegerField(max_value=100, min_value=20)
sms_code = serializers.CharField(max_length=6, min_length=6)
class Meta:
model = BookInfo # 指定生成字段的模型类
# fields = ('btitle', 'bread') # 指定模型类中的字段
fields = '__all__' # 指定模型类中的字段
# vexclude =('btitle') # 取反操作,除了这个字段外的其他字段都生成
# 添加修改字段的选项参数
extra_kwargs = {
"bcomment":{
'max_value': 80
},
'btitle':{
'min_length': 5
}
}
注意在使用新增未存在的字段时候,需要使用fields = '__all__' 或者fields = ('btitle', 'bread') 定义出来这个字段,否则会报错,找不到这个字段。
三、还有一个添加选项参数的方法
read_only_fields = ('btitle',) ,给字段增加read_only的参数
class BookModelSerializer(serializers.ModelSerializer):
# 显示指明字段,可以指明已有的字段,还可以指明没有的字段
bread = serializers.IntegerField(max_value=100, min_value=20)
sms_code = serializers.CharField(max_length=6, min_length=6)
class Meta:
model = BookInfo # 指定生成字段的模型类
# fields = ('btitle', 'bread') # 指定模型类中的字段
fields = '__all__' # 指定模型类中的字段
# vexclude =('btitle') # 取反操作,除了这个字段外的其他字段都生成
# 给字段增加 read_only的选项参数
read_only_fields = ('btitle',)
# 添加修改字段的选项参数
extra_kwargs = {
"bcomment":{
'max_value': 80
},
'btitle':{
'min_length': 5
}
}
总结:
ModelSerializer可以对我们指定的模型类,自动的生成字段内容
ModelSerializer与常规的Serializer区别
1、基于模型类自动生成一些列字段
2、基于模型类自动为Serializer生成validators,比如unique_together
3、包含默认的create()和update()的实现