如何在 Django Admin 中禁用事务?

2024-06-08

I used @transaction.non_atomic_requests for 被超越的save() in Person model如下所示:

# "store/models.py"

from django.db import models
from django.db import transaction

class Person(models.Model):
    name = models.CharField(max_length=30)
    
    @transaction.non_atomic_requests # Here
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

而且,我还用过@transaction.non_atomic_requests for 被超越的save_model() in Person admin如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Person
from django.db import transaction

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

    @transaction.non_atomic_requests # Here
    def save_model(self, request, obj, form, change):
        obj.save()

但是,当添加数据时,如下所示:

交易如下所示使用。 *我用PostgreSQL下面的这些日志是PostgreSQL 的查询你可以检查在 PostgreSQL 上,如何使用事务查询(例如“BEGIN”和“COMMIT”)记录查询 https://stackoverflow.com/questions/54780698/postgresql-database-log-transaction/73432601#73432601:

并且,当更改数据时,如下所示:

交易使用如下图所示:

并且,当点击Delete button of 换人如下所示:

然后点击Yes, I'm sure button删除数据如下图:

交易使用如下图所示:

并且,在选择时Delete selected persons并点击Go button of 选择要更改的人如下所示:

然后点击Yes, I'm sure button删除数据如下图:

交易使用如下图所示:

那么,我该如何禁用交易 in Django 管理员?


首先禁用交易添加和更改数据时,需要覆盖更改表单视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L1743 in Person admin如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Person
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 # Here
    def changeform_view(self, request, object_id=None, form_url="", extra_context=None):
        return self._changeform_view(request, object_id, form_url, extra_context)

因为默认情况下,更改表单视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L1743 has with transaction.atomic(...): to use 交易添加和更改数据时如下所示:

class ModelAdmin(BaseModelAdmin):
    
    # ...
    
    @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)): # Here
            return self._changeform_view(request, object_id, form_url, extra_context)

结果添加数据时如下图:

交易未使用如下所示:

并且,当更改数据时,如下所示:

交易未使用如下所示:

接下来要禁用交易当点击时Delete button of 换人然后点击Yes, I'm sure button要删除数据,您需要覆盖删除视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L2102 in Person admin如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Person
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 # Here
    def delete_view(self, request, object_id, extra_context=None):
        return self._delete_view(request, object_id, extra_context)

因为默认情况下,删除视图() https://github.com/django/django/blob/main/django/contrib/admin/options.py#L2102 has with transaction.atomic(...): to use 交易当点击时Delete button of 换人然后点击Yes, I'm sure button删除数据如下图:

class ModelAdmin(BaseModelAdmin):
    
    # ...
    
    @csrf_protect_m
    def delete_view(self, request, object_id, extra_context=None):
        with transaction.atomic(using=router.db_for_write(self.model)): # Here
            return super()._delete_view(request, object_id, extra_context)

结果,当点击Delete button of 换人如下所示:

然后点击Yes, I'm sure button删除数据如下图:

交易未使用如下所示:

最后,您不需要禁用交易 for Delete selected persons因为默认情况下交易不用于Django 管理操作包括Delete selected persons。 *你可以看到my post https://stackoverflow.com/questions/74965894/by-default-is-transaction-used-in-django-admin-actions解释更多关于默认情况下,Django 管理操作为非事务.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django Admin 中禁用事务? 的相关文章

随机推荐