当Django REST Framework故意引发错误时发生事务错误

问题描述:

我已经使用Django REST Framework从2.x版本更新到最后一个稳定版本(3.1.3)。在我的序列化程序中修复了一些不推荐的用法之后,我运行了python manage.py test以确保没有任何内容被破坏。当Django REST Framework故意引发错误时发生事务错误

一切工作正常,除了我测试无效的REST请求(有意)的一些测试。例如:

def test_get_events_of_other_user(self): 
    # Assume the setUp log the user1 with self.client 
    # and here, there is some code initializing an 
    # event for user2 
    response = self.client.get("/event/123/") 
    self.assertEqual(404, response.status_code) 

的视图集中生成一个ORM查询像MyEventModel.objects.get(user=request.user, pk=123),这显然提高了在DRF 404例外,因为没有对象应该在这里返回(我知道,它应该是一个403是REST -compliant ...)。但是,这引起了TransactionManagementError

Traceback (most recent call last): 
    [...] 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/viewsets.py", line 85, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 456, in dispatch 
    response = self.handle_exception(exc) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 421, in handle_exception 
    response = exception_handler(exc, context) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 81, in exception_handler 
    set_rollback() 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/compat.py", line 277, in set_rollback 
    transaction.set_rollback(True) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/django/db/transaction.py", line 215, in set_rollback 
    return get_connection(using).set_rollback(rollback) 
    File "/my_virtual_env_path/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 372, in set_rollback 
    "The rollback flag doesn't work outside of an 'atomic' block.") 
TransactionManagementError: The rollback flag doesn't work outside of an 'atomic' block. 

它看起来像我的中间件之一是做视后,一些SQL查询,并击中了transaction closed by DRF, since the 3.1.3。期望的行为(即得到一个404 NOT FOUND)与3.1.2 ...

一起工作有没有人有我如何可以避免回滚的想法? DRF是否是一种误解?

这看起来像DRF中已经修复的错误。正如你可以看到here他们已经改变了代码,以便它只在原子块中回滚。

由于没有更新的版本发布,您可以将相同的修补程序应用到您的已安装的代码,或使用较早的版本,直到3.1.3被取代。

+0

确实,它适用于此修复程序。我将继续使用3.1.2版本,直到3.1.4版本结束。感谢您的链接! –