Django序列化器中is_valid和validate

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

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

python 复制代码
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()方法。如下:

python 复制代码
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(),就会触发该重写的方法,效果如下:

相关推荐
FriendshipT2 分钟前
Ultralytics:解读CBLinear模块
人工智能·pytorch·python·深度学习·目标检测
程序员清风21 分钟前
推荐几个我常听的AI播客!
java·后端·面试
AI开发发烧友26 分钟前
LangGraph多Agent协作实战:以物流售前场景为例的5 Agent工作流设计
python
码云骑士29 分钟前
70-多Agent协作-CrewAI-AutoGen-角色分工与信息传递协议
python
JavaGuide43 分钟前
Kimi K3 实战:全栈项目、Java 项目改造与 3A 游戏 Demo
后端·ai编程
wuqingshun31415944 分钟前
如何理解Spring Boot中的starter?
java·spring boot·后端
AskHarries1 小时前
PayPal 接入避坑
后端
谭光志1 小时前
深入浅出 RAG:用一个可运行的 Demo 讲透完整链路
前端·后端·ai编程
wuqingshun3141591 小时前
SpringBoot是如何实现自动配置的
java·spring boot·后端
道友可好1 小时前
前端工程师的 AI 时代生存指南
前端·人工智能·后端