2017-08-26 30 views
1

這是我的模型:Django的:斷開post_save信號以避免遞歸

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

可能是你可以使用'pre_save()'的信號,而不是'post_save()'和剛剛更新的領域pre_save做不要將實例保存在其中。 – Rohan

回答

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) 
+0

該解決方案有效。但是'update'通常不是用於多個對象嗎? – manuk

+0

是的,你通常對於多個,但你可以用它作爲'功能'這種情況下。 –