序列化和反序列化
序列化:指将复杂的QuerySet和Model类型转换成Python基本数据类型,从而将这些基本数据类型以JSON的形式响应给客户端
反序列化:将Http请求中传入的JSON数据转换成复杂的数据类型,从而保存在数据库中。
在REST Framework中,提供了多个用于序列化操作的类,但常用的也就如下两个:
-
Serializer:进行序列化基本的类;
-
ModelSerializer:继承于Serializer,内部实现了通用的序列化逻辑,其中包含了与Model字段对应的字段,可以快速对Model进行序列化。
Serializer
如何对一个Model进行序列化操作
已知的model:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=40)
age = models.IntegerField()
number = models.IntegerField(unique=True)
date = models.DateField()
在app/下创建serializer.py文件:
from rest_framework import serializers
from .models import Student
class StudentSerializer(serializers.Serializer):
# 定义要序列化的字段
name = serializers.CharField(read_only=True)
age = serializers.IntegerField(read_only=True)
number = serializers.IntegerField(read_only=True)
date = serializers.DateField(read_only=True)
# 在反序列化时,当save()调用时生成一个Student对象
def create(self, validated_data):
# 会将生成的实例保存到数据库
return Student.objects.create(**validated_data)
# 在反序列化时,当save()调用时更新Student对象
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.age = validated_data.get('age', instance.age)
instance.number = validated_data.get('number', instance.number)
instance.date = validated_data.get('date', instance.date)
instance.save() #确保保存在数据库
return instance
这个序列化类中有两部分:
1.定义了要进行序列化的字段;这些字段负责将Python类型转换成JSON类型,即序列化的过程;
2.定义了当serializer.save()时用于生成Model对象的create()和update()方法,这两方法负责将JSON类型的数据转换成Python类型的数据,即反序列化的过程。
常用的Field
(https://blog.csdn.net/FightFightFight/article/details/80059024)
在定义Model时,我们通过models.<FieldName>获取了各种不同的字段,作为数据库中表的一个列。而在Serializer中,也需要通过`serializers.<FieldName>的形式获取对应Model的字段,用来在JSON数据和Python数据类型之间进行转换,此外还可以根据Field中传入的属性进行校验、设置默认值。
1.CharField
对应models.CharField,同时如果指定长度,还会负责校验文本长度。max_length:最大长度;min_length:最小长度;allow_blank=True:表示允许将空串做为有效值,默认False;
2.EmailField
对应models.EmailField,验证是否是有效email地址。
3.IntegerField
对应models.IntegerField,代表整数类型
4.FloatField
对应models.FloatField,代表浮点数类型
5.DateTimeField
对应models.DateTimeField,代表时间和日期类型。format='YYYY-MM-DD hh:mm':指定datetime输出格式,默认为DATETIME_FORMAT值。 serializers.Field中的公共参数
Serializer的方法和属性
1.save()
在调用serializer.save()时,会创建或者更新一个Model实例(调用create()或update()创建),具体根据序列化类的实现而定
# .save() will create a new instance.
serializer = StudentSerializer(data=data)
# .save() will update the existing `comment` instance.
serializer = StudentSerializer(comment, data=data)
2.create()、update()
Serializer中的create()和update()方法用于创建生成一个Model实例,在使用Serializer时,如果要保存反序列化后的实例到数据库,则必须要实现这两方法之一,生成的实例则作为save()返回值返回。方法属性validated_data表示校验的传入数据。
3. is_valid()
当反序列化时,在调用Serializer.save()之前必须要使用is_valid()方法进行校验,如果校验成功返回True,失败则返回False,同时会将错误信息保存到serializer.errors属性中。
4.data
serializer.data中保存了序列化后的数据。
5.errors
当serializer.is_valid()进行校验后,如果校验失败,则将错误信息保存到serializer.errors属性中。
ModelSerializer
ModelSerializers继承于Serializer,相比其父类,ModelSerializer自动实现了以下三个步骤:
1.根据指定的Model自动检测并生成序列化的字段,不需要提前定义;
2.自动为序列化生成校验器;
3.自动实现了create()方法和update()方法。
使用ModelSerializer方式如下:
lass StudentSerializer(serializers.ModelSerializer):
class Meta:
# 指定一个Model,自动检测序列化的字段
model = StudentSerializer
fields = ('id', 'name', 'age', 'birthday')
# fields = '__all__': 表示所有字段
# exclude = ('add_time',): 除去指定的某些字段
# 这三种方式,存在一个即可
model
该属性指定一个Model类,ModelSerializer会根据提供的Model类自动检测出需要序列化的字段。默认情况下,所有Model类中的字段将会映射到ModelSerializer类中相应的字段。
fields
如果不希望对Model中所有的字符进行序列化,可以在fields属性中显示指定要进行序列化的字段。
参考:
https://blog.csdn.net/FightFightFight/article/details/80059024