【问题标题】:How to disable transaction in Django Admin?如何在 Django Admin 中禁用事务?
【发布时间】:2022-12-14 22:46:16
【问题描述】:

我用了@transaction.non_atomic_requests为了被覆盖的save()Person模特如下所示:

# "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为了被覆盖的save_model()Person管理员如下所示:

# "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 的查询你可以查看On PostgreSQL, how to log queries with transaction queries such as "BEGIN" and "COMMIT"

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

交易如下图所示使用:

而且,当点击Delete按钮换人如下所示:

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

交易如下图所示使用:

而且,在选择的时候Delete selected persons并点击Go按钮选择要更改的人如下所示:

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

交易如下图所示使用:

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

【问题讨论】:

    标签: python python-3.x django transactions django-admin


    【解决方案1】:

    您需要在中覆盖changeform_view()Person管理员如下所示:

    # "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)
    

    因为默认情况下,changeform_view()with transaction.atomic(...):使用交易如下所示:

    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)
    

    结果,添加数据时如下图:

    交易未使用,如下所示:

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

    交易也没有使用,如下所示:

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 2017-02-04
      • 2021-09-10
      • 2014-05-03
      • 2013-05-04
      • 2012-09-10
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多