模型类序列化器

模型类序列化器

  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())

 

posted @ 2018-11-10 11:49  苦瓜爆炒牛肉  阅读(453)  评论(0编辑  收藏  举报