序列化使用
序列化: 模型对象 / QuerySet -> 字典 / 列表
一、基本使用
1、查询出要序列化的模型对象
dep = Department.objects.get(id=1)
2、创建序列化器
serializer = DepartmentSerializer(dep)
3、通过 data属性
获取序列化后的结果(字典数据)
serializer.data
# {'create_date': '2009-01-01', 'name': '研发部',
# 'is_delete': False, 'id': 1}
4、如果要序列化的是包含多条数据的QuerySet,则需要指定many=True
query_set = Department.objects.all()
serializer = DepartmentSerializer(query_set, many=True)
serializer.data
# [ OrderedDict([('id', 1), ('name', '研发部'), ('create_date', '2009-01-01'), ('is_delete', False)]),
# OrderedDict([('id', 2), ('name', '人事部'), ('create_date', '2009-03-01'), ('is_delete', False)])]
二、关联对象序列化
关联对象序列化时,需要指定该如何序列化关联对象
例如:在序列化一个员工对象,员工所属部门
这个关联属性 应该怎么返回呢?最常用的有三种情况:
第1种:返回 关联对象的主键
第2种:返回关联对象的 字符串表示方式,即__str__
方法的返回值
第3种:返回关联对象序列化器定义的所有属性
{
"name": "赵小一",
"department": 1, # 第1种:PrimaryKeyRelatedField
}
{
"name": "赵小一",
"department": "研发部", # 第2种:StringRelatedField
}
{
"name": "赵小一",
"department": { # 第3种:DepartmentSerializer
"id": 1,
"name": "研发部",
"create_date": "2018-1-1"
}
}
1. PrimaryKeyRelatedField
- 此字段将会序列化为关联对象的主键
-
必须包含read_only=True或者queryset参数:
- 包含
read_only=True
参数时,该字段只能读取不能修改 - 包含
queryset
参数时,将在反序列化,会用作参数合法性校验
- 包含
class EmployeeSerializer(Serializer)
...
# 第一种
department = serializers.PrimaryKeyRelatedField(label='所属部门', read_only=True)
# department = serializers.PrimaryKeyRelatedField(label='所属部门',
# queryset=Department.objects.all())
使用效果:
from users.serializers import *
from users.models import *
employee = Employee.objects.get(id=1)
serializer = EmployeeSerializer(employee)
serializer.data
# {'salary': '12000.00', 'comment': None, 'department': 1, ...}
2. StringRelatedField
序列化为关联对象的字符串表示(即__str__
方法的返回值)
class Department(models.Model):
...
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class EmployeeSerializer(Serializer)
...
# 第2种
department = serializers.StringRelatedField(label='所属部门')
使用效果:
from users.serializers import *
from users.models import *
employee = Employee.objects.get(id=1)
serializer = EmployeeSerializer(employee)
serializer.data
# {'salary': '12000.00', 'comment': None, 'avatar': None,
# 'department': '研发部', ...}
3. 使用关联对象序列化器
class EmployeeSerializer(Serializer)
...
# 第3种
department = DepartmentSerializer(label='所属部门')
使用效果
from users.serializers import *
from users.models import *
employee = Employee.objects.get(id=1)
serializer = EmployeeSerializer(employee)
serializer.data
# {'avatar': None, 'comment': None, 'hire_date': '2011-01-01',
# 'salary': '12000.00', 'id': 1, 'name': '赵小一', ...,
# 'department': OrderedDict([
# ('id', 1),
# ('name', '研发部'),
# ('create_date', '2009-01-01'),
# ('is_delete', False)]),
# }
三、many=true
参数
如果要序列化的关联对象的值有多个,例如:序列化 部门对象
时,要对部门关联的员工对象
进行序列化,此时也有类似上面的三种方式:
{
"name": "研发部",
...
"employee_set": [1,2], # 第1种:PrimaryKeyRelatedField
}
{
"name": "研发部",
...
"employee_set": ['张三','李四'], # 第2种:StringRelatedField
}
{
"name": "研发部",
...
"employee_set": [ # 第3种:EmployeeSerializer
{
'name':'张三',
'id':1
},
{
'name':'张三',
'id':2
}
],
}
关联字段类型的指定仍可使用上述几种方式,只是在声明关联字段时,多补充一个many=True
参数即可。
class EmpSerializer(serializers.Serializer):
id = serializers.IntegerField(label='ID', read_only=True)
name = serializers.CharField(label='姓名', max_length=20)
class DepartmentSerializer(serializers.Serializer):
id = serializers.IntegerField(label='ID', read_only=True)
name = serializers.CharField(label='部门名称', max_length=20)
create_date = serializers.DateField(label='成立时间')
is_delete = serializers.BooleanField(label='是否删除', required=False)
# 此处employee_set名字固定: 关联模型类名_set
# 第1种: PrimaryKeyRelatedField
# employee_set = serializers.PrimaryKeyRelatedField(
# label='部门员工', read_only=True, many=True)
# 第2种:StringRelatedField
# employee_set = serializers.StringRelatedField(
# label='部门员工', read_only=True, many=True)
# 第3种:关联对象序列化器
employee_set = EmpSerializer(
label='部门员工', read_only=True, many=True)