这是我的模特:
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)
然而,我无法断开和连接信号。有没有人有任何建议?
答案 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)