【发布时间】:2018-04-18 15:04:49
【问题描述】:
我最近遇到需要在我的一个视图中禁用事务请求,以便能够在请求期间调用db.connection.close() 和connect() 以提高性能。
我有一个 DRF ViewSet,并使用以下非常简单的视图来验证 non_atomic_requests 装饰器似乎没有效果。 ATOMIC_REQUESTS=True 在settings.py 和DEBUG=False 中启用。
from django.db import transaction
@transaction.non_atomic_requests
def create(self, *args, **kwargs):
m = MyModel(stuff="hello")
m.save()
raise Exception('exception! row should still be saved though')
return Response()
调用视图后,我打开 Django shell,并验证数据库中的行数没有增加,即使它应该增加。在m.save() 行之后请求停止执行期间还打开一个调试器,我可以在 Django shell 中观察到新行尚不可见。
如果我在settings.py 中设置ATOMIC_REQUESTS=False,代码将按预期工作,并且数据库中的行数增加一,即使在从视图返回之前引发错误。
当ATOMIC_REQUESTS=False 时,使用@transaction.atomic 装饰器确实可以按预期工作。因此,作为一种解决方法,我可以使用它将所有其他视图设置为原子...
我目前认为这是框架中的一个错误。谁能验证我的发现,或者指出我是否误解了这个装饰器的功能?
我正在使用 Python 3.6、Django 2.0 和 DRF 3.7.7。
【问题讨论】:
-
由于之前的加薪,返回线永远不会到达
标签: python django transactions django-rest-framework