zoukankan      html  css  js  c++  java
  • 模型类序列化器

    模型类序列化器

    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())
  • 相关阅读:
    动态代理:JDK动态代理和CGLIB代理的区别
    关于国密算法 SM1,SM2,SM3,SM4 的笔记
    加密算法比较3DES AES RSA ECC MD5 SHA1等
    通过mybatis向数据库中插入日期数据
    mapreduce流程中的几个关键点
    MapReduce二次排序
    Hadoop自定义分组Group
    编译hadoop2.6.0
    ERROR [org.apache.hadoop.security.UserGroupInformation]
    Java集合分组
  • 原文地址:https://www.cnblogs.com/chichung/p/9938813.html
Copyright © 2011-2022 走看看