Как отключить транзакцию в Django Admin?

Я использовал @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 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()

Но при добавлении данных, как показано ниже:

enter image description here

Transaction используется как показано ниже. * Я использовал PostgreSQL и эти журналы ниже являются запросами PostgreSQL и вы можете проверить В PostgreSQL, как регистрировать запросы с транзакционными запросами, такими как "BEGIN" и "COMMIT":

enter image description here

А также при изменении данных, как показано ниже:

enter image description here

Transaction также используется, как показано ниже:

enter image description here

Итак, как я могу отключить transaction в Django Admin?

Вам необходимо переопределить changeform_view() в 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)

По умолчанию, changeform_view() имеет with transaction.atomic(...): использовать transaction, как показано ниже:

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)

В результате, при добавлении данных, как показано ниже:

enter image description here

Транзакция не используется, как показано ниже:

enter image description here

А также при изменении данных, как показано ниже:

enter image description here

Transaction также не используется, как показано ниже:

enter image description here

Вернуться на верх