我的简化问题如下:

我有一个这样的模型:

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 的alert 对象发生更改时.我要在此方法更改后打印连接到alert 的硬币数量:

@receiver(post_save, sender=Alert)
def handle_alert_save(sender, instance,  **kwargs):
    coins = instance.coins.all()
    print(len(coins))

Unfortunately!它会在零钱alert 前打印硬币编号.我想换个对象后再来. 换句话说,POST_SAVE信号恰好等于PRE_SAVE.

for example当我有2枚连接到Aler的硬币时,我把它换成了5.它打印了2!

我try 了所有其他信号,如PRE_SAVE和PRE_DELETE以及PRE_MIGRATE和POST_MIGRATE.

推荐答案

不,它确实触发了信号after保存Alert,但多对多字段保存after保存Alert,所以在那个时候,确实仍然没有硬币更新.这是many reasons not to use signals in the first place [django-antipatterns]个中的一个.

你可以用m2m_changed signal [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))

但就我个人而言,我认为信号往往不是一个好主意,应该作为最后的手段.简单地添加一个函数来执行逻辑,并在更改Alert实例的.coins的视图中触发它,可能会更健壮.

Django相关问答推荐

Django Model邮箱字段是必需的,即使在我将其设置为NULL=True和BLACK=True之后也是如此

Django-HTMX:呈现到不同目标的表单验证错误

Django 中主键的隐式 UUID 自动字段

情节主题更改问题

django.template.response.ContentNotRenderedError: 必须渲染响应内容才能迭代

为什么 timezone.now 在作为默认值应用于 Django 中的 DateField 时显示future 日期

如何在 Django 模板视图中显示我的数据?

查询 django 模型以找到当月最好的公司销售

在 Django 模板中呈现标签名称而不是整数字段

Django:无法从另一个应用程序导入模型

可插拔应用程序的Django默认设置约定?

TestCase 类中的 setUpClass、setUpTestData 和 setUp 有什么区别?

Django中的单表继承

Django:访问给定字段的 Select 元组

Django 向用户推送 HTTP 响应

Django:如何使用动态(非模型)数据预填充 FormView?

django-object-permissions Vs django-guardian Vs django-authority

在 Django 中注册用户的最佳方法

javascript 文件中的 Django {% static 'path' %}

访问 django 管理模板中的对象