模型类序列化器

Posted chichung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型类序列化器相关的知识,希望对你有一定的参考价值。

模型类序列化器

  1. DRF提供了模型类序列化器: ModelSerializer
  2. 作用: 简化对应django模型类的序列化器的定义

ModelSerializer与常规的Serializer相同,但提供了:

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为 Serializer 生成 validators,比如字段唯一的校验器
  • 包含默认的 create() 和 update() 的实现

 

1. 定义

比如我们创建一个 DepartmentSerializer2

class DepartmentSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Department    
        fields = __all__    # 包含模型类中所有的字段
  • model 指明参照哪个模型类
  • fields 指定序列化器中的属性有哪些 (可以是模型类中的字段,也可以模型类中没有的但需要校验的属性,比如类似:短信验证码,确认密码)

python console 交互环境中,查看生成的序列化器

>>> s = DepartmentSerializer2()
>>> s
DepartmentSerializer2():
    id = IntegerField(label=ID, read_only=True)
    name = CharField(label=部门名称, max_length=20)
    create_date = DateField(label=成立时间)
    is_delete = BooleanField(label=是否删除, required=False)

 

2. 指定字段

1) fields属性:指定序列化器中包含哪些字段,如下:

class DepartmentSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = (id, name)

 

2) exclude属性:排除掉模型类中指定的字段

class DepartmentSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Department
        exclude = (is_delete,)       # 注意:`exclude`不能与`fields`同时使用

 

3) 指明只读字段

可以通过 read_only_fields 指明只读字段,即 仅用于序列化输出,在反序列化时不会进行校验和修改

class DepartmentSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Department
        fields = __all__
        read_only_fields = (id, create_date)  # 这些字段不能修改

 

4) 指定 关联属性的序列化方式

class EmployeeSerializer2(serializers.ModelSerializer): 
    # 1. 返回关联对象的主键
    department = PrimaryKeyRelatedField(read_only=True)
    # 2. 返回关联对象的字符串表示(即Department类的 __str__ 方法的返回值)
    # department = StringRelatedField(read_only=True)
    # 3. 返回关联对象序列化器定义的属性
    # department = DepartmentSerializer(read_only=True)

    class Meta:
        model = Employee
        fields = __all__

class DepartmentSerializer2(serializers.ModelSerializer):
    # 名字固定: 类名小写_set
    employee_set = PrimaryKeyRelatedField(read_only=True, many=True)
    # employee_set = StringRelatedField(read_only=True, many=True)
    # employee_set = EmployeeSerializer(read_only=True, many=True)

    class Meta:
        model = Department
        fields = __all__                             # ok
        # fields = (‘id‘, ‘name‘, ‘employee_set‘)    # ok
        # fields = (‘id‘, ‘name‘)                     # error

 

3. 添加额外参数: extra_kwargs 属性

我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数

class EmployeeSerializer2(serializers.ModelSerializer):

    class Meta:
        model = Employee
        fields = __all__
        extra_kwargs = {
            name: {min_length: 5, max_length: 20},
            age: {min_value: 1, max_value: 200},
        }

# 结果如下:

EmployeeSerializer2():
    id = IntegerField(label=ID, read_only=True)
    name = CharField(label=姓名, max_length=20, min_length=5)
    age = IntegerField(label=年龄, max_value=200, min_value=1)
    gender = ChoiceField(choices=((0, ), (1, )), label=性别, required=False, 
             validators=[<django.core.validators.MinValueValidator object>, 
                         <django.core.validators.MaxValueValidator object>])
    salary = DecimalField(decimal_places=2, label=工资, max_digits=8)
    comment = CharField(allow_blank=True, allow_null=True, label=备注,             
                        max_length=300, required=False)
    hire_date = DateField(label=入职时间, read_only=True)
    department = PrimaryKeyRelatedField(label=所属部门, 
                                        queryset=Department.objects.all())

 

以上是关于模型类序列化器的主要内容,如果未能解决你的问题,请参考以下文章

如何从django中具有@property装饰器的模型类序列化函数

教程4 - 验证和权限

python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)

python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)

php 一个自定义的try..catch包装器代码片段,用于执行模型函数,使其成为一个单行函数调用

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段