Как отключить транзакцию в 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()
Но при добавлении данных, как показано ниже:
Transaction используется как показано ниже. * Я использовал PostgreSQL и эти журналы ниже являются запросами PostgreSQL и вы можете проверить В PostgreSQL, как регистрировать запросы с транзакционными запросами, такими как "BEGIN" и "COMMIT":
А также при изменении данных, как показано ниже:
Transaction также используется, как показано ниже:
Итак, как я могу отключить 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)
В результате, при добавлении данных, как показано ниже:
Транзакция не используется, как показано ниже:
А также при изменении данных, как показано ниже:
Transaction также не используется, как показано ниже: