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

时间:2019-04-06 18:29:40

标签: django django-signals

我真的在文档中找不到任何可靠的内容。可以说我正在做这样的事情:

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()。这是原子的吗?我绝对希望整个过程都是原子的,因为这样可以节省评论,但是该项目的总评分没有更新是解决错误的方法。

1 个答案:

答案 0 :(得分:1)

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

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

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

class Review(models.Model):
    ...

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