欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django之serializer-ModelSerializer

程序员文章站 2022-06-28 18:42:44
一. 模型序列化器和普通序列化器对比没有使用ModelSerializer序列化器时,我们自定义的序列化器类需要添加对应模型类中的很多字段,但是如果添加的字段有成百个,是否也需要一个一个手动添加呢?所以有一种更为简洁的模型序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建普通序列化器类示例:在这里插入代码片......

一、模型序列化器和普通序列化器对比

没有使用ModelSerializer序列化器时,我们自定义的序列化器类需要添加对应模型类中的很多字段,但是如果添加的字段有成百个,是否也需要一个一个手动添加呢?所以有一种更为简洁的模型序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建
普通序列化器类示例:

class ProjectsSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',validators=[        validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
    leader = serializers.CharField(max_length=200, label='项目负责人', help_text='项目负责人帮助文档')
    tester = serializers.CharField(max_length=200, label='测试人员', help_text='测试人员帮助文档',
                                   error_messages={"required": "tester该字段必传", "max_length": "长度不能操作5个字节"})

使用模型序列化器类(ModelSerializer)如下:

class ProjectsModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Project
        fields = '__all__'

可以看见,已经简化很多,规则总结如下:

  • 需要在Meta类中使用model类属性来指定需要按照哪一个模型类来创建
  • fields类属性指定模型类中哪些字段需要输入或输出
  • 默认id主键会添加read_only=True
  • create_time和update_time会默认添加read_only=True
  • ModelSerializer类中自带的有create和update方法,无需重写即可生效

二、使用方法

直接使用ModelSerializer实例化的对象替换掉原先的序列化器类对象


class IndexPageView(View):

    def get(self, request):
        """
        get请求,请求所有数据,未分页
        :param request:
        :return:
        """
        qs = Project.objects.all()

        # ser_obj = ProjectsSerializer(instance=qs, many=True)
        ser_obj = ProjectsModelSerializer(instance=qs, many=True)
        return JsonResponse(ser_obj.data, status=200, safe=False)

三、反序列化校验

1.默认全部字段输出或输入
在Meta子类中定义类属性fields=‘all

fields = '__all__'

2.指定需要输出或输入的字段
在Meta子类中定义类属性fields=(字段1,字段2,…)

fields = ('id', 'name', 'leader', 'tester','email')

3.排除不需要输出或输入的字段
在Meta子类中定义类属性exclude=(字段1,字段2,…)

exclude = ('desc',)

4.只允许序列化输出
在Meta子类中定义类属性read_only_fields=(字段1,字段2,…)

read_only_fields = ('id',)

5.自定义校验规则
5-1.在ModelSerializer类中创建字段类的对象
其优先级最高,如果以该方式创建的字段很多,可以选择普通的序列化器类来定义

class ProjectsModelSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
                                 validators=[
                                     validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])

    class Meta:
        model = Project
        fields = ('id', 'name', 'leader', 'tester', 'email')

5-2.在Meta子类中定义extra_kwargs字段
键为字段名,值为一个字典,其中键为校验项,值为校验规则

class ProjectsModelSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
                                 validators=[
                                     validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])

    class Meta:
        model = Project
        fields = ('id', 'name', 'leader', 'tester')
        extra_kwargs = {
            'tester': {
                'label': '测试负责人',
                'max_length': 2
            }
        }

四、添加不在模型类里面而需要反序列化的字段

  • 定义字段
  • 添加字段名称到ModelSerializer序列化器类Meta子类的fields属性中
  • 在Meta子类中重写create或者update方法
class ProjectsModelSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
                                 validators=[
                                     validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
    email = serializers.EmailField(max_length=50)
    class Meta:
        model = Project
        fields = ('id', 'name', 'leader', 'tester', 'email')
        extra_kwargs = {
            'tester': {
                'label': '测试负责人',
                'max_length': 2
            }
        }

    def create(self, validated_data):
        email = validated_data.pop('email')
        return super().create(validated_data)

本文地址:https://blog.csdn.net/weixin_47454485/article/details/107354474