Django:断开post_保存信号以避免递归

xzlaal3s  于 2023-01-14  发布在  Go
关注(0)|答案(3)|浏览(110)

这是我的模型:

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)

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

8wtpewkr

8wtpewkr1#

你可以直接用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)
vjrehmav

vjrehmav2#

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

zazmityj3#

它不适用于Django 4.0。
现在您需要禁用信号的某个处理程序。

post_save.disconnect(your_handler, sender=Papier)

相关问题