django事务atomc装饰器,类视图

django事务atomc装饰器,类视图,django,Django,我有几个基于类的视图 在其中一个视图中,我们假设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在某种程度上是一种

我有几个基于类的视图

在其中一个视图中,我们假设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
在某种程度上是一种路线视图。根据某些条件,它将请求传递给其他视图以返回响应

我想在
View1
上使用
transaction.atomic
装饰器,原子事务会应用于我调用的所有视图吗?i、 e调用其他视图不会取消原子请求吗

到目前为止,我使用以下方法装饰View1:

  • 将视图包装在URL中的
    transaction.atomic
  • View1
    post()
    方法上使用了
    @method\u decorator(transaction.atomic)
问题是,使用这两种方法中的任何一种将视图设置为原子视图,即使View1返回时出现错误(异常)“View1没有返回HttpResponse..”,对象仍在创建中


为什么?

您还可以定义一个基于类的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 ...

原子用于数据库事务,以确保数据被保留,不返回http响应不会影响这一点。问题是,何时执行回滚?根据django文档,任何以未捕获异常退出的原子视图都不会创建对象。不返回HttpResponse在django中是个例外。。嗯,你是对的,我一直认为它是指数据库错误(抱歉),我认为问题是不返回http响应的错误不在原子块的范围内,因为它是调用视图责任以确保返回响应的方法