我真的在文档中找不到任何可靠的内容。可以说我正在做这样的事情:
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()
。这是原子的吗?我绝对希望整个过程都是原子的,因为这样可以节省评论,但是该项目的总评分没有更新是解决错误的方法。
答案 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)