post_save接缝有bug

问题描述 投票:0回答:1

我的简化问题如下:

我有一个这样的模型:

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。

django django-signals
1个回答
0
投票

不,它确实触发了信号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
的视图中触发此操作,可能会更可靠。

© www.soinside.com 2019 - 2024. All rights reserved.