序列化使用

序列化使用

序列化: 模型对象 / 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值