Django REST framework(二)-序列化器定义与使用_simpleyako的博客-CSDN博客
Django REST framework(三)-反序列化的使用_simpleyako的博客-CSDN博客
如果我们想要使用基于Django模型类的序列化器,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
什么时候声明的序列化器需要继承序列化器基类Serializer,什么时候继承模型序列化器类ModelSerializer?
继承序列化器类Serializer
字段声明
验证
添加/保存数据功能
继承模型序列化器类ModelSerializer
字段声明[可选,看需要]
Meta声明
验证
添加/保存数据功能[可选]
看数据是否从mysql数据库中获取,如果是则使用ModelSerializer,不是则使用Serializer
ModelSerializer与常规的Serializer相同,但提供了:
- 基于模型类自动生成一系列字段
- 基于模型类自动为序列化器生成validators,比如unique_together
- 包含默认的create()和update()的实现
1. 定义
比如我们创建一个BookInfoSerializer:
class ModelSerializer(serializers.ModelSerializer):
# 自动生成序列化验证字段
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.指定所有字段
fields = '__all__'
- model 指明参照哪个模型类
- fields 指明为模型类的哪些字段生成
我们可以在python manage.py shell中查看自动生成的BookInfoSerializer的具体实现
自动生成的字段参数值可能不符合我们的要求,所有我们可以通过以下显示指明字段或为自动生成的字段添加额外参数
2. 指定字段
1) 使用fields来明确字段,__all__ 表名包含所有字段,也可以写明具体哪些字段,如
class ModelSerializer(serializers.ModelSerializer):
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.指定创建字段
fields = ('name', 'readcount')
2) 使用exclude可以明确排除掉哪些字段
class ModelSerializer(serializers.ModelSerializer):
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.排除不需要的字段exclude(不能和fields同时使用)
exclude = ('is_delete',)
3) 显示指明字段,如:
class ModelSerializer(serializers.ModelSerializer):
# 显示指明需要进行验证序列化的字段
name = serializers.CharField(label='名称', max_length=20, min_length=1)
# 自动生成序列化验证字段
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.指定创建字段
fields = ('name', 'readcount')
4) 指明只读字段
可以通过read_only_fields指明只读字段,即仅用于序列化输出的字段
class ModelSerializer(serializers.ModelSerializer):
# 显示指明需要进行验证序列化的字段
name = serializers.CharField(label='名称', max_length=20, min_length=1)
# 自动生成序列化验证字段
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.指定创建字段
# fields = ('name', 'readcount')
# 3.指定所有字段
fields = '__all__'
# 4.指定只序列化的字段
read_only_fields = ('name',)
3. 添加额外参数
我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数
class ModelSerializer(serializers.ModelSerializer):
# 显示指明需要进行验证序列化的字段
name = serializers.CharField(label='名称', max_length=20, min_length=1)
# 自动生成序列化验证字段
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.指定创建字段
# fields = ('name', 'readcount')
# 3.指定所有字段
fields = '__all__'
# 4.指定只序列化的字段
read_only_fields = ('name',)
# 5.排除不需要的字段exclude(不能和fields同时使用)
# exclude = ('is_delete',)
# 6.添加或修改原有的选项参数
extra_kwargs = {
'name': {
'require': True,
},
'pub_date': {
'allow_null' : True
}
}
4.添加验证方法?
ModelSerializer与 Serializer的区别:
1.ModelSerializer继承至Serializer
2.ModerSerializer已经帮我们定义好了Crete,update方法,只需要在视图中传入相应的参数调用save()方法即可
3.ModerSerializer已经帮我们实现了一个判断字段唯一值的方法,需要在定义模型类的时候指定字段是唯一值才起作用
4.其他的单一字段验证,多字段验证需要我们自写(validate_field_name,validate)
# 自定义单一字段验证
def validate_name(self, value):
if value == 'python':
raise serializers.ValidationError('书名不能为python')
return value
# 自定义多字段验证
def validate(self, attrs):
"""
:param attrs:对象字典
:return:attrs
"""
if attrs['readcount'] > attrs['commentcount']:
raise serializers.ValidationError('读书量大于评论量')
return attrs
?5.测试?
? 1)ModelSerializer序列器定义
# -----------------------------------模型类序列化器的使用---------------------------------
class ModelSerializer(serializers.ModelSerializer):
readcount = serializers.IntegerField(min_value=0, max_value=100000, default=0)
commentcount = serializers.IntegerField(min_value=0, max_value=100000, default=0)
# 自动生成序列化验证字段
class Meta:
# 1.指定模型类表名
model = BookInfo
# 2.排除不需要的字段exclude(不能和fields同时使用)
exclude = ('id','is_delete')
# 3.添加或修改原有的选项参数
extra_kwargs = {
'name': {
'required': True,
},
'pub_date': {
'allow_null' : True
}
}
# 自定义单一字段验证
def validate_name(self, value):
if value == 'python':
raise serializers.ValidationError('书名不能为python')
return value
# 自定义多字段验证
def validate(self, attrs):
"""
:param attrs:对象字典
:return:attrs
"""
if attrs['readcount'] > attrs['commentcount']:
raise serializers.ValidationError('读书量大于评论量')
return attrs
?
?2) 视图和路由
# 路由
path('ModelSerializer/' , ModelSerializerView.as_view())
# 视图
class ModelSerializerView(View):
def get(self, request):
books = BookInfo.objects.all()
ser = ModelSerializer(instance=books, many=True)
return http.JsonResponse({
'data': ser.data
})
def put(self, request):
pk = request.GET.get('pk')
book = BookInfo.objects.get(id = pk)
json_dict = json.loads(request.body.decode())
ser = ModelSerializer(instance=book, data=json_dict)
ser.is_valid()
ser.save()
return http.JsonResponse(ser.data)
def post(self, request):
json_str = request.body.decode()
json_dict = json.loads(json_str)
ser = ModelSerializer(data=json_dict)
if ser.is_valid() is False:
return http.JsonResponse(
ser.errors
)
ser.save()
return http.JsonResponse({
'data': ser.data
})
3)get
4)? put
?5) post
?
?
|