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

时间:2017-08-26 12:13:51

标签: python django signals

这是我的模特:

class Paper(models.Model):
    ...
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
    rang = models.IntegerField(default=0)
    class Meta:
        ordering = ['collection','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)

然而,我无法断开和连接信号。有没有人有任何建议?

2 个答案:

答案 0 :(得分:2)

您可以使用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)

答案 1 :(得分:0)

关于禁用特定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)