我的简化问题如下:
我有一个这样的模型:
class Alert(models.Model):
ALERT_CHOICES = [("email","email"),("sms","sms"),("notif","notif")]
name = models.CharField(max_length = 50)
owner = models.ForeignKey(User , on_delete=models.CASCADE)
coins = models.ManyToManyField(Coin,blank=True)
当Alert之类的对象发生变化时。我想打印此方法更改后连接到警报的硬币数量:
@receiver(post_save, sender=Alert)
def handle_alert_save(sender, instance, **kwargs):
coins = instance.coins.all()
print(len(coins))
不幸的是!它会在更改警报之前打印硬币数量。我想要改变对象后。 换句话说,post_save 信号完全等于 pre_save。
例如当我有 2 个连接的硬币到 aler 时,我将其更改为 5。它会打印 2!
我尝试了所有其他信号,例如 pre_save 和 pre_delete 以及 pre_migrate 和 post_migrate。
不,它确实触发了信号after保存
Alert
,但是多对多字段是after保存Alert
保存的,所以当时确实还没有更新币。这是首先不使用信号的许多原因之一[django-antipatterns]。
m2m_changed
信号 [Django-doc] 代替:
from django.db.models.signals import m2m_changed
@receiver(m2m_changed, sender=Alert.coins.through)
def handle_alert_save(sender, instance, **kwargs):
coins = instance.coins.all()
print(len(coins))
但就我个人而言,我认为信号通常不是一个好主意,应该作为最后的手段使用。只需添加一个函数来执行逻辑,并在更改
.coins
实例的 Alert
的视图中触发此操作,可能会更可靠。