繁体   English   中英

Transaction.atomic同时覆盖Django model中的save()方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM