美文网首页
30、serialzers自定义异常以及自带的异常提示

30、serialzers自定义异常以及自带的异常提示

作者: 猪儿打滚 | 来源:发表于2020-08-11 09:30 被阅读0次

    背景

    有时候需要重写序列化类的create方法或update方法。那么当逻辑进入异常时,我们不希望直接抛出系统异常,而是返回自定义异常响应给前端,以便于前端显示。

    步骤

      1. 创建工具类utils.py,继承APIException
    from rest_framework.exceptions import APIException
    
    
    class ParamsException(APIException):
        """
        serializers自定义错误响应
        """
    
        def __init__(self, error):
            self.detail = error
    
    • 2、在对应app的serializers.py中这样进行调用,例如:
    from rest_framework import serializers
    
    from .models import Envs
    from utils.drf_utils import ParamsException
    
    
    class EnvSerializer(serializers.ModelSerializer):
        class Meta:
            model = Envs
            exclude = ('create_time', 'is_delete')
            ex_kwargs = {
                'update_time': {
                    'read_only': True
                }
            }
    
        def create(self, validated_data):
            """
            判断名字是否已存在再进行创建(逻辑删除视为不存在)
            :param validated_data: 
            :return: 
            """
            if not Envs.objects.filter(name=validated_data['name'], is_delete=False).count():
                return super().create(validated_data)
            else:
                raise ParamsException({'code': 2001, 'msg': '名称已存在'})
    
    • 3.对应的model.py
    from django.db import models
    
    from utils.base_models import BaseModel
    
    
    class Envs(BaseModel):
        id = models.AutoField(primary_key=True, verbose_name='主键', help_text='主键')
        name = models.CharField(max_length=120, verbose_name='环境名称', help_text='环境名称')
        desc = models.CharField(max_length=800, null=True, blank=True, verbose_name='环境描述', help_text='环境描述')
        host = models.URLField(max_length=200, verbose_name='环境host', help_text='环境host')
    
        class Meta:
            db_table = 'pf_envs'
            verbose_name = '环境表'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.name
    
    • 4.发出请求以及结果


      请求参
      结果

    DRF自带的错误提示

    raise serializers.ValidationError('xxxx')

    from rest_framework import serializers
    
    from .models import Envs
    from utils.drf_utils import ParamsException
    
    
    class EnvSerializer(serializers.ModelSerializer):
        class Meta:
            model = Envs
            exclude = ('create_time', 'is_delete')
            ex_kwargs = {
                'update_time': {
                    'read_only': True
                }
            }
    
        def create(self, validated_data):
            """
            判断名字是否已存在再进行创建(逻辑删除视为不存在)
            :param validated_data: 
            :return: 
            """
            if not Envs.objects.filter(name=validated_data['name'], is_delete=False).count():
                return super().create(validated_data)
            else:
                serializers.ValidationError('名称已存在')
    
    • 结果:


      提示内容

    相关文章

      网友评论

          本文标题:30、serialzers自定义异常以及自带的异常提示

          本文链接:https://www.haomeiwen.com/subject/budedktx.html