drf 之ModelSerializer

ぐ巨炮叔叔 提交于 2020-03-08 17:58:29

ModelSerializer

- ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样。

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

    '''
    基于模型类自动生成一系列字段
    基于模型类自动为Serializer生成validators,比如unique_together
    包含默认的create()和update()的实现
    '''
    
- 在使用ModelSerializer序列化器时,我们只需要定义好序列化器类,并指定好对应的模型类
和字段即可。ModelSerializer序列化器自动帮我们定义好了字段信息及约束信息。

1. 创建ModelSerializer序列化器类

1.1 对模型类中所有字段都进行序列化和反序列化操作。

我们通过设置Meta类中的fields属性的值可以指定序列化器能够操作的字段数据。
当fields='__all__'时,表示序列化器能够对模型类中的所有字段数据进行序列化与反序列化的操作。


# 定义ModelSerializers序列化器
class BookInfoModelSerializer(serializers.ModelSerializer):
    '''定义图书信息的ModelSerializers序列化器'''

    class Meta:
        # 指定序列化器对应的模型类
        # model = 模型类名
        model = BookInfo

        # 对全部字段进行序列化和反序列化操作
        fields = '__all__' # __all__表示所有字段进行序列化
        

1.2 对模型类中特定的字段进行序列化和反序列化操作。

当fields = (‘字段1’,...)时,表示当前的序列化器只能对元组中的字段进行序列化与反序列化操作。

class BookInfoModelSerializer(serializers.ModelSerializer):
    '''ModelSerializers序列化器'''

    class Meta:
        # 指定序列化器对应的模型类
        model = BookInfo

        # 对指定字段进行序列化和反序列化操作
        fields = ('bread','btitle','bcomment')
        
        

1.3 指定模型类中不能被序列化和反序列化的字段。

在Meta类中,我们也可以通过指定exclude属性的值,来设置不能够被当前序列化器进行序列化与反序列化的字段数据。通过exclude属性指定的字段,并没有被创建出来,也就是说明无法被序列化器进行操作。

class BookInfoModelSerializer(serializers.ModelSerializer):
    '''ModelSerializers序列化器'''

    class Meta:
        # 指定序列化器对应的模型类
        model = BookInfo

        # 指定不进行序列化和反序列化操作的字段
        exclude = ('id', )          
        
        
        
        

1.4 指定关联字段

因为ModelSerializer序列化器时Serializer的子类,所以Serializer序列化能够进行的事ModelSerializer序列化器也能够进行。

在ModelSerializer序列化器中,我们也需要追加关联字段来实现关联序列化操作,并且关联方式与Serializer序列化器一致。

这里,我就只举一个多对一关联的例子,大家了解即可。

class HeroInfoModelSerializer(serializers.ModelSerializer):
    '''定义查询Hero信息的ModeleSerializer序列化器'''

    # 添加关联字段(多对一)
    hbook = BookInfoModelSerializer()

    class Meta:
        # 指定模型类
        model = HeroInfo
        # 指定字段
        fields = ('id', 'hname', 'hbook')

1.5 指定只读字段

在ModelSerializer序列化器中,我们可以通过在Meta类中,指定read_only_fields属性的值来设置只读字段。

class BookInfoModelSerializer(serializers.ModelSerializer):
    '''定义图书信息的ModelSerializers序列化器'''

    class Meta:
        # 指定序列化器对应的模型类
        # model = 模型类名
        model = BookInfo

        # 对全部字段进行序列化和反序列化操作
        fields = '__all__' # __all__表示所有字段进行序列化

        # 定义只读字段
        read_only_fields = ('id',)


'''
id = IntegerField(label='ID', read_only=True)
'''

1.6 为指定字段添加验证参数

在ModelSerializer序列化器中,我们可以通过在Meta类中,指定extra_kwargs属性的值来为指定的字段添加验证参数。

这里,我们需要注意的时extra_kwargs属性的值个格式是个字典。

extra_kwargs = {
     '字段名':{
          '验证选项':'验证条件',
     }
}

案例代码:

class BookInfoModelSerializer(serializers.ModelSerializer):
    '''定义图书信息的ModelSerializers序列化器'''

    class Meta:
        # 指定序列化器对应的模型类
        # model = 模型类名
        model = BookInfo

        # 对全部字段进行序列化和反序列化操作
        fields = '__all__' # __all__表示所有字段进行序列化

        # 添加字段验证选项
        extra_kwargs = {
            'bcomment':{
                'min_value':0,
                'max_value':99999
            }
        }

'''
shell测试代码:
    - bcomment = IntegerField(label='评论量', max_value=99999, min_value=0, required=False)
''' 

2. ModelSerializer也可以进行验证的扩展操作。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!