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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django 1.11更改视图中禁用原子事务相关的知识,希望对你有一定的参考价值。

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类中的方法来解决。

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的默认行为是在自动提交模式下运行。

“默认行为”在这里表示“在没有关于交易范围的具体指导的情况下的行为”。在您引用的changeform_view中,代码显式使用事务API,表明它不想使用默认的自动提交模式。

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

所以没有设置或其他方法来禁用所有Django上的事务API。

以上是关于在Django 1.11更改视图中禁用原子事务的主要内容,如果未能解决你的问题,请参考以下文章

在视图中使用全文搜索 + GIN (Django 1.11 )

Django - 使用事务原子回滚保存

django中数据库事务的处理

django的事务

Django 1.11:在 url 中的查询参数中浮动

Django 2.2 如何在列表视图中禁用复选框