如果查看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)
答案 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)
将使用您已定义的正确状态代码进行验证并引发错误