Django管理员:关闭数据库事务

8
我注意到默认情况下,Django管理站点中的所有更新都作为事务执行。
我需要做以下事情之一: - 关闭事务(全局或特定的管理视图) - 在通过管理界面保存的实体的save()方法内提交事务
原因是我覆盖了save()方法,并通知外部非Django系统刚刚发生的更改。但是,由于Django仍然没有提交事务,所以外部系统无法看到更新。
有没有人对如何实现此操作有任何建议?

1
很好的问题。这是Django管理界面中竞争条件的常见来源,如果您不了解Django在视图中使用事务,那么追踪它可能会非常令人沮丧。 - Cerin
我们在 https://pypi.python.org/pypi/django-celery-transactions 上取得了很大的成功。它的作用是确保在启动后台任务之前运行的事务完成后,才允许运行该任务。 - Jeremy Robin
4个回答

5

您可以使用commit_manually在特定的视图/函数中获取事务的完全控制。



0
一个更好的解决方案可能是调查您的数据库事务隔离设置,因为这是外部进程无法“看到”更新的真正原因...

0

仅当在Django管理界面上更改(更新)数据时,您可以通过覆盖{{link1:changeform_view()}}来关闭事务。*您还可以查看{{link2:我的帖子}},了解如何在Django管理界面中关闭所有事务。

例如,下面是Person()模型

# "store/models.py"

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)

然后,您需要重写changeform_view(),如下所示。*当添加数据时,object_idNone,而在更改数据时,object_id不为None

# "store/admin.py"

from django.contrib import admin
from .models import Person
from django.db import transaction
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
 
csrf_protect_m = method_decorator(csrf_protect)

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):

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

现在,当添加数据时:

enter image description here

事务的使用如下所示。*我使用PostgreSQL,下面的日志是PostgreSQL的查询语句,您可以查看如何记录带有事务的PostgreSQL查询

enter image description here

但是,当更改数据时:

enter image description here

事务不应该像下面这样使用:

enter image description here

如果您不像下面所示覆盖changeform_view()

# "store/admin.py"

from django.contrib import admin
from .models import Person

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    pass

然后,更改数据:

enter image description here

Transaction 的使用如下所示:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接