仅当在Django管理界面上更改(更新)数据时,您可以通过覆盖{{link1:changeform_view()}}来关闭事务。*您还可以查看{{link2:我的帖子}},了解如何在Django管理界面中关闭所有事务。
例如,下面是Person()
模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
然后,您需要重写changeform_view()
,如下所示。*当添加数据时,object_id
为None
,而在更改数据时,object_id
不为None
:
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](https://istack.dev59.com/RYsmS.webp)
事务的使用如下所示。*我使用PostgreSQL,下面的日志是PostgreSQL的查询语句,您可以查看如何记录带有事务的PostgreSQL查询:
![enter image description here](https://istack.dev59.com/U5rvD.webp)
但是,当更改数据时:
![enter image description here](https://istack.dev59.com/UneCL.webp)
事务不应该像下面这样使用:
![enter image description here](https://istack.dev59.com/ymoGa.webp)
如果您不像下面所示覆盖changeform_view()
:
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
pass
然后,更改数据:
![enter image description here](https://istack.dev59.com/UneCL.webp)
Transaction 的使用如下所示:
![enter image description here](https://istack.dev59.com/xU7sX.webp)