如何从DRF Serializer返回特定响应?

时间:2018-05-22 23:23:02

标签: django django-rest-framework

如果查看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)

2 个答案:

答案 0 :(得分:1)

我们必须验证序列化程序中的数据,如下面的代码

declare module 'vue2-google-maps' {
  import _Vue from 'vue'
  import { PluginObject, PluginFunction } from "vue/types/plugin"
  export default class GMaps<T> implements PluginObject<T> {
    install(Vue: typeof _Vue, options?: T): void
  }
}

答案 1 :(得分: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)将使用您已定义的正确状态代码进行验证并引发错误