当前位置: 移动技术网 > IT编程>脚本编程>Python > Django之serializer-ModelSerializer

Django之serializer-ModelSerializer

2020年07月16日  | 移动技术网IT编程  | 我要评论

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

没有使用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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网