在 Django 1.11 更改视图中禁用原子事务

Disable atomic transaction in Django 1.11 change view

Django 1.11 有以下代码

@csrf_protect_m
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    with transaction.atomic(using=router.db_for_write(self.model)):
        return self._changeform_view(request, object_id, form_url, extra_context)

env/lib/python3.6/site-packages/django/contrib/admin/options.py

根据 doc Django 1.11 应该在自动提交模式下工作,但 changeform_view 似乎与文档不一致。 Django 管理表单保存在事务中发生。

我通过重写模型的 ModelAdmin class 中的方法解决了问题。

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    return self._changeform_view(request, object_id, form_url, extra_context)

但是有没有办法为所有具有设置的模型启用 django 表单的自动提交模式?

你误会了the documentation

Django's default behavior is to run in autocommit mode.

"Default behavior"这里的意思是"behavior in the absence of specific guidance on the scope of the transaction"。在您引用的 changeform_view 中,代码明确使用事务 API,表明它不想使用默认的自动提交模式。

请注意,您的更改不会确保代码在自动提交模式下运行。这是因为从 _changeform_view 中调用的任何函数本身可能会使用事务 API,从而禁用自动提交。 Django 的许多部分都使用事务,因为它们对于确保正确的行为至关重要。

因此没有任何设置或其他方法可以在整个 Django 中禁用事务 API。