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)
我真的在文档中找不到任何可靠的东西。假设我正在做这样的事情:
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)