关于在串行器之外验证Django REST Framework中的数据,我遇到了类似的问题:
Raise Validation Error In Pre_Save Using Django Rest Framework
我的代码:
def pre_save(self, obj):
data = self.request.DATA['users']
for user in data:
if not user in allowed_users:
raise ParseError('An unpermitted user has been included')
从跟踪看起来它似乎正在尝试发送响应,但它失败了:
在可以使用多对多关系之前,“”需要具有字段值。
更新:
我将ParseError提升为get_serializer_class()方法,如下所示:
def get_serializer_class(self):
if 'users' in self.request.DATA:
# make sure the users are allowed
data = self.request.DATA['users']
for user in data:
if not user in allowed_users:
raise ParseError(detail='Unpermitted user')
return serializer
然而,这引发了异常,但它并没有使用REST框架的JSON响应返回它。相反,我得到了django堆栈跟踪和500错误,这是不好的。
谢谢!
答案 0 :(得分:2)
查看APIView
's handle_exception
- 这是DRF处理请求期间引发的异常的地方。
来自文档:
默认实现处理
rest_framework.exceptions.APIException
的任何子类,以及Django的Http404
和PermissionDenied
异常,并返回相应的错误响应。如果您需要自定义API返回的错误响应,则应该对此方法进行子类化。
所以你需要覆盖它来处理ParseError
例外。
另请查看Exceptions上的DRF文档。
我希望有所帮助。
答案 1 :(得分:0)
当在pre_save方法(),post_save()或甚至视图类的post()方法中引发异常时,Django-REST-Framework正在正确处理它。如果我一直在使用curl或类似的,错误将被正确返回。
这实际上是可浏览API中的一个错误,这是我用来测试的 - 使用“原始数据”表单发送数据。在尝试渲染html响应时,DRF显然试图捕获帖子的“上下文”。在这种情况下,它想要保存/完成的帖子。
那不存在,所以抛出了一个Django渲染错误,让我很困惑。
使用curl进行测试时,响应是准确的。
请注意,将它放在get_serializer_class()中就像我所做的那样导致它超出了DRF异常处理程序,因此Django正确地渲染它并显示错误被正确抛出。