繁体   English   中英

Django:断开 post_save 信号以避免递归

[英]Django: disconnect a post_save signal to avoid recursion

这是我的 model:

class Paper(models.Model):
    ...
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
    rang = models.IntegerField(default=0)
    class Meta:
        ordering = ['collection','rang']

保存 model 时,我希望它更新 model 的每个 object 中的所有“rang”字段,以便它们增加 10。

我使用下面的 post_save 信号来避免递归问题:

@receiver(post_save, sender=Papier)
def redifine_rang(sender, *args,  **kwargs):
    for idx, paper in enumerate(Paper.objects.filter(collection = kwargs['instance'].collection)):
        paper.rang = idx*10
        Signal.disconnect(post_save, sender=Papier)
        paper.save()
        Signal.connect(post_save, sender=Papier)

但是,我无法获得断开连接和连接的信号。 有人有什么建议吗?

你可以只使用update

Paper.objects.filter(pk=paper.pk).update(rang=idx*10)

而不是

paper.rang = idx*10
Signal.disconnect(post_save, sender=Papier)
paper.save()
Signal.connect(post_save, sender=Papier)

关于禁用特定post_save信号的方法的一些说明。 这样:

Signal.disconnect(post_save, sender=Papier)

不适用于 Django 2.2。

关闭信号的工作选项如下所示:

from django.db.models.signals import post_save
from django.dispatch import Signal


Signal.disconnect(post_save, receiver=redifine_range, sender=Papier)

它不适用于 Django 4.0。

现在您需要为信号禁用某个处理程序。

post_save.disconnect(your_handler, sender=Papier)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM