Django序列化器中is_valid和validate

今天上班的时候分配了一个任务,是修复前端的一个提示优化,如下图所示:

按照以往的经验我以为可以直接在validate上进行校验,如何抛出一个异常即可 ,例如:

class CcmSerializer(serializers.ModelSerializer):

    class Meta:
        model = Ccm
        fields = "__all__"

    def validate(self, attrs):
        print(1111)
        name = attrs.get("name")
        identification = attrs.get("identification")
        description = attrs.get("description")
        if len(name) > 64:
            raise serializers.ValidationError(
                f"CCM名称长度不能超过64个字符")
        if len(identification) > self.Meta.model._meta.get_field('identification').max_length:
            raise serializers.ValidationError(
                f"CCMID长度不能超过64个字符")
        return attrs

但是,当在视图中执行serializer.is_valid()的时候,validate()函数并没有触发,我非常疑惑,于是乎打断点进行测试,最终发现validate()其实是当serializer.is_valid()返回True的并且执行serializer.save()的时候才会触发的。所以要想在校验字段的时候抛出自定义的异常信息,就需要重写is_valid()方法。如下:

class CcmSerializer(serializers.ModelSerializer):

    class Meta:
        model = Ccm
        fields = "__all__"

    def is_valid(self, raise_exception=False):
        initial_data = self.initial_data
        if len(initial_data.get("name")) > NORMAL:
            raise serializers.ValidationError(f"CCM名称长度不能超过{NORMAL}字符")
        if len(initial_data.get("identification")) > NORMAL:
            raise serializers.ValidationError(f"CCM标识长度不能超过{NORMAL}字符")
        return super().is_valid(raise_exception)

经过修改后,在视图中调用serializer.is_valid(),就会触发该重写的方法,效果如下:

相关推荐

  1. Pydantic validator validators 的区别

    2024-06-06 01:56:02       55 阅读
  2. C++序列序列

    2024-06-06 01:56:02       59 阅读
  3. C#序列序列

    2024-06-06 01:56:02       30 阅读
  4. Django5+DRF序列

    2024-06-06 01:56:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 01:56:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 01:56:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 01:56:02       87 阅读
  4. Python语言-面向对象

    2024-06-06 01:56:02       96 阅读

热门阅读

  1. nuxt3 api如何透传(不引第3方库)

    2024-06-06 01:56:02       28 阅读
  2. Lisp解析器技术文档

    2024-06-06 01:56:02       19 阅读
  3. Django 默认 CSRF 保护机制

    2024-06-06 01:56:02       34 阅读
  4. C语言编译与链接

    2024-06-06 01:56:02       31 阅读
  5. 设计模式(简要,应付软考)

    2024-06-06 01:56:02       25 阅读
  6. 概率图模型在自然语言处理中的应用

    2024-06-06 01:56:02       25 阅读
  7. AWS与SAP扩大战略合作:通过AI增强ERP解决方案

    2024-06-06 01:56:02       31 阅读
  8. 6月01日,每日信息差

    2024-06-06 01:56:02       28 阅读
  9. Vue 过渡和动画

    2024-06-06 01:56:02       37 阅读
  10. qcc更换语音提示的方法

    2024-06-06 01:56:02       28 阅读
  11. Oracle 数据泵(Data Pump)的impdp解析

    2024-06-06 01:56:02       31 阅读