Django-ModelSerializer序列化器


一、自动生成序列化器类

前面说的那种序列化器,整个序列化器类都要自己写,代码和model类高度相似,于是就有了ModelSerializer序列化器,可以自动生成序列化器类。

1.1 自动生成序列化器类

# 自动生成需继承serializers.ModelSerializer
class ProjectModelSerializer(serializers.ModelSerializer):
    class Meta:
    	# model指定用哪一个类生成序列化器类
        model = Projects
        
        # fields指定模型类中需要进行序列化操作的字段,如果指定了模型类中没有定义的字段,那么必须在fields元组中指定,如果fields为'__all__'或者exclude除外
        # '__all__',指定模型类中所有的字段都需要进行序列化操作
        # fields = '__all__'
        # 可以指定模型类中序列化操作的字段,需要在元组中指定
        # fields = ('id', 'name', 'leader', 'is_execute')
        fields = ('id', 'name', 'leader', 'is_execute', 'interfaces', 'token', 'email')
        # exclude指定不需要进行序列化操作的字段(如果元祖只有一个元素,后面要加逗号)
        # exclude = ('create_time', 'update_time', 'is_execute')

        # 可以在Meta内部类的read_only_fields,统一指定需要添加read_only=True的字段
        read_only_fields = ('is_execute', 'desc', 'id')

ModelSerializer特点:

  1. 继承ModelSerializer,根据模型类来自动生成序列化器类中的字段
  2. 必须得指定model参数(模型类),用于指定使用的模型
  3. 会实现create、update方法
    如果不需要对数据进行特殊操作就不需要重写这两个方法,如果有特殊处理,例如调用save()方法的时候传了关键字参数,那么重写这两个方法,pop掉多余的参数后,调用父类的对应方法。
  4. 会给主键字段、DataTimeField(指定auto_now_add和auto_now参数),会添加read_only=True
  5. 会给有指定default参数的字段,添加required=False
  6. 会给有指定null参数的字段,添加allow_null=True
  7. 会给有指定blank参数的字段,添加allow_blank=True

二、修改自动生成的字段信息

2.1.1 方式一

重新定义模型类中的字段,需注意的是,这里需要把参数写全,因为重新定义该字段后会覆盖自动生成的同名字段。

class ProjectModelSerializer(serializers.ModelSerializer):
    name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=10, min_length=3,
                                 error_messages={
    
    'min_length': '项目名称不能少于3位', 'max_length': '项目名称不能超过10位'},
                                 validators=[
                                     UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
                                     is_contain_keyword
                                 ])

2.1.2 方式二

可以在Meta内部类的extra_kwargs中对自动生成的序列化字段进行修改(此处的修改只能针对模型类中有的字段,不支持修改自己在序列化器类中自己添加的字段),将需要修改的字段名作为key,具体修改的内容作为value。此方式不会覆盖自动生成的同名字段,只是在自动生成的参数后追加参数或修改参数。

class ProjectModelSerializer(serializers.ModelSerializer):
    class Meta:
    	...

        extra_kwargs = {
    
    
            'name': {
    
    
                'label': '项目名称',
                'max_length': 10,
                'min_length': 3,
                'error_messages': {
    
    
                    'min_length': '项目名称不能少于3位',
                    'max_length': '项目名称不能超过10位'
                },
                'validators': [
                    UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
                    is_contain_keyword
                ],
                'write_only': True
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_33537936/article/details/113618914