Django 中的 post_save 信号是原子的吗?

Is the post_save signal in Django atomic?

我真的在文档中找不到任何可靠的东西。假设我正在做这样的事情:

from django.db.models.signals import post_save
from django.dispatch import receiver

class Item(models.Model):
    total_score = models.IntegerField()

    def set_score(self):
         ...

class Review(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    score = models.IntegerField()

@receiver(post_save, sender=Review)
def my_handler(sender, **kwargs):
    sender.item.set_score()

我想做的是在保存评论对象时为项目对象调用 set_score()。这是原子的吗?我绝对希望整个事情是原子的,因为评论被保存的情况,但项目的总分没有更新是错误的秘诀。

不,关于数据库事务的信号没有什么特别的(Django 处理的唯一一种原子性)。由您来确保相关命令始终是同一数据库事务的一部分。

一种方法是简单地依靠调用代码通过使用 ATOMIC_REQUESTS、在您的视图中使用事务等来完成此操作

或者,由于 post_save 信号作为 Model.save() 的一部分发送,您可以简单地覆盖 Review.save() 并使其使用交易。

class Review(models.Model):
    ...

    @transaction.atomic()
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)