[英]Transaction.atomic while overriding save() method in Django model?
我在我的 model 中覆盖了默认的save()
方法,并在那里创建了一个相关的 model 实例:
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
parent_folder = None
if self.parent:
parent_folder = self.parent.task_folders.all().first()
folder, created = Folder.objects.get_or_create(
project=self.project,
task=self,
parent=parent_folder,
defaults={'name': self.name,
'project': self.project,
'task': self,
'creator': self.creator,
'parent': parent_folder,
'is_root': True
})
问题是 - 我应该在这里使用transaction.atomic
吗? 它如何与save()
方法一起使用?
如果希望两个数据库操作都是原子操作,则应使用transaction.atomic()
。 具体来说,如果Folder
创建失败,是否应该回滚save()
应用的更改? 如果答案是肯定的,请在def save()
上使用transaction.atomic
装饰器。
不,您不需要在Django Model中为覆盖的“save( )”显式使用原子事务,例如“@transaction.atomic”或“transaction.atomic()” ,因为原子事务隐式用于覆盖的“save()” ” 。
使用PostgreSQL ,我尝试使用下面的代码是否隐式地使用原子事务来覆盖“save()” 。 * "SELECT"、"INSERT"、"UPDATE" 和 "DELETE" 查询在覆盖的 "save()"中使用"Animal" class运行:
# "store/models.py"
from django.db import models
class Animal(models.Model):
name = models.CharField(max_length=30)
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def save(self, *args, **kwargs):
animal = Animal.objects.all() # For "SELECT" query
print(animal) # Needed to run "SELECT" query
Animal(name='Dog').save() # For "INSERT" query
Animal.objects.filter(name="Dog").update(name="Cat") # For "UPDATE" query
Animal.objects.filter(name="Cat").delete() # For "DELETE" query
def __str__(self):
return self.first_name + " " + self.last_name
然后,我添加一个人来运行“Person”class中覆盖的“save()” ,如下所示。 *实际上,没有添加“John Smith”这个人,因为覆盖的“save()”没有“super().save(*args, **kwargs)” :
现在,在"BEGIN" 和 "COMMIT" 查询之间, "SELECT"、"INSERT"、"UPDATE" 和 "DELETE" 查询在覆盖的 "save()"中使用"Animal" class运行。 因此, Atomic Transaction隐式用于覆盖的 save() 。 *以下这些日志是 PostgreSQL 的查询日志:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.