我有几个基于类的视图。
在其中一个中,让我们说View1可以调用其他视图来返回响应。
所以我有这样的事情:
class View1(View):
def post(self, request, *args, **kwargs):
# Some logic ...
return View2.as_view()(request) # There are more lines like this calling to other views.
所以View1
有点像路线视图。根据某些条件,它将请求传递给其他视图以返回响应。
我想在transaction.atomic
上使用View1
装饰器,原子事务是否适用于我调用的所有视图?即对其他观点的调用不会取消原子请求吗?
到目前为止,我使用以下方法来装饰View1:
transaction.atomic
中的视图包装在网址中。 @method_decorator(transaction.atomic)
的{{1}}方法上使用了post()
。问题是,使用两种方法中的任何一种将视图设置为原子,即使View1返回错误(异常)" View1也没有返回HttpResponse ..",对象是仍然被创造。
为什么?
答案 0 :(得分:0)
您还可以定义一个可以使用的基于类的mixin:
class AtomicMixin(object):
def dispatch(self, request, *args, **kwargs):
with transaction.atomic():
return super(AtomicMixin, self).dispatch(request, *args, **kwargs)
class View1(AtomicMixin, View):
def post(self, request, *args, **kwargs):
# Some logic ...