【问题标题】:How to return a specific response from DRF Serializer?如何从 DRF 序列化器返回特定响应?
【发布时间】:2018-05-22 23:23:01
【问题描述】:

如果您查看 is_valid() 方法下的 try/except 块,我正在尝试检查对象是否存在,如果存在,则返回 202 错误。我的问题是我可以直接从序列化程序返回响应,还是需要引发特定异常然后在视图中处理异常?

class CreateJobSerializer(GenericSerializer):
    class Meta:
        model = Job
        fields = ('name',)
        validators = []


    def is_valid(self, raise_exception=False):
        if hasattr(self, 'initial_data'):
            super(CreateJobSerializer, self).clean_ids()
            try:
                Job.objects.get(name=self.initial_data['name'])
                return Response(serializer.errors, status=status.HTTP_202_ACCEPTED)
            except:
                return super().is_valid(raise_exception)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    首先HTTP_202不是错误状态。 202 的描述是

    请求已被接受处理,但处理尚未完成。

    您可以直接从序列化程序进行此类验证。例如

    class CreateJobSerializer(serializers.ModelSerializer):
        class Meta:
            model = Job
            fields = ('name',)
    
        def validate_name(self, value):
            if Job.objects.filter(name=value).exists():
                raise serializers.ValidationError("Name already exist")
            return value
    

    如果您仍想使用 HTTP_202,则通过继承默认 APIException 创建新异常并将 status_code 覆盖为 202。现在引发新异常。

    from rest_framework.exceptions import APIException
    
    class APIException202(APIException):
        status_code = 202
    
    class CreateJobSerializer(serializers.ModelSerializer):
        class Meta:
            model = Job
            fields = ('name',)
    
        def validate_name(self, value):
            if Job.objects.filter(name=value).exists():
                raise APIException202("Name already exist")
            return value
    

    并在视图中使用is_valid 方法进行验证

    serializer = CreateJobSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    

    serializer.is_valid(raise_exception=True) 将使用您定义的正确状态代码进行验证并引发错误

    【讨论】:

    • 这几乎可以正常工作,但我现在不知道为什么会出现此错误:异常值:__init__() 获得了意外的关键字参数“状态”我已导入状态但仍然错误
    • 对不起,我的错。我们不能直接添加 status_code。必须从 APIException 创建新异常并覆盖状态代码。我已经更新了我的答案。请检查一下。并随时询问是否发生任何错误
    【解决方案2】:

    我们必须像下面的代码那样在序列化器中验证数据

    from rest_framework.exceptions import APIException
    
    class CreateJobSerializer(GenericSerializer):
    
      def validate_name(self, name):
         if Job.objects.filter(name=name).exists():
            raise APIEXception(
                detail="Job with this name already exists",
                status=status.HTTP_202_ACCEPTED
            )
         return name
    
      class Meta:
        model = Job
        fields = ('name',)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多