Django REST框架故意引发错误时发生事务错误

Django REST框架故意引发错误时发生事务错误,django,django-rest-framework,sqltransaction,Django,Django Rest Framework,Sqltransaction,我已经使用Django REST框架将一个项目从2.x版本更新为最新的稳定版本(3.1.3)。在修复了序列化程序中一些不推荐的用法之后,我运行了python manage.py测试,以确保没有任何东西被破坏 除了我测试无效REST请求(故意)的一些测试之外,一切都正常。例如: def test_get_events_of_other_user(self): # Assume the setUp log the user1 with self.client # and here,

我已经使用Django REST框架将一个项目从2.x版本更新为最新的稳定版本(3.1.3)。在修复了序列化程序中一些不推荐的用法之后,我运行了
python manage.py测试
,以确保没有任何东西被破坏

除了我测试无效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…)。但这会引发一个
事务管理错误

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查询,并点击了。期望的行为(即找不到404)与3.1.2


有人知道我如何避免回滚吗?这是DRF中的错误观念吗?

这看起来像是DRF中已经修复的错误。正如您所看到的,他们已经更改了代码,使其仅在原子块中回滚


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

事实上,它可以与此修复程序一起使用。在3.1.4发布之前,我将继续使用3.1.2版本。谢谢你的链接!