使用ParseError Django REST框架返回无效数据

使用ParseError Django REST框架返回无效数据,django,rest,python-2.7,django-rest-framework,Django,Rest,Python 2.7,Django Rest Framework,关于在序列化程序之外验证Django REST框架中的数据,我有一个类似的问题: 我的代码: 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') 从跟踪来看,它似

关于在序列化程序之外验证Django REST框架中的数据,我有一个类似的问题:

我的代码:

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错误,这是不好的

谢谢

看看-这是DRF处理请求期间引发的异常的地方

从文档中:

默认实现处理
rest\u framework.exceptions.APIException
的任何子类,以及Django的
Http404
PermissionDenied
异常,并返回适当的错误响应

如果需要自定义API返回的错误响应,则应将此方法子类化

因此,您也需要重写它来处理
ParseError
异常

还可以查看上的DRF文档


我希望这会有所帮助。

当在viewclass的pre_save method()、post_save()甚至post()方法中引发异常时,Django REST框架正确地处理了该异常。如果我使用了curl或类似的方法,那么错误就会正确返回

这实际上是可浏览API中的一个bug,这是我用来测试的——使用“原始数据”表单发送数据。当试图呈现html响应时,DRF显然试图捕获文章的“上下文”。在这种情况下,它需要保存/完成的帖子

这是不存在的,所以抛出了Django渲染错误,这让我很困惑

使用curl进行测试时,响应是准确的


请注意,像我一样将其放入get_serializer_class(),会导致它超出DRF异常处理程序,因此Django正确地呈现了它,并显示错误被正确抛出。

感谢Carlton提供的提示。看起来问题更多地与可浏览的API有关。