2017-08-26 4 views
1

を避けるために、post_save信号を切断これは私のモデルである:ジャンゴ:再帰

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

モデルを保存するとき、私は彼らが増加するように、それはモデルの各オブジェクト内のすべての「鳴り」フィールドを更新したいです

@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) 

しかし、私は切断して接続する信号を取得することはできません。10.

によって私は再帰の問題を回避するには、以下のpost_save信号を使用します。誰にも何か推奨事項はありますか?

+0

使用することができますその中にインスタンスを保存しないでください。 – Rohan

答えて

2

あなたはちょうどあなたが()の代わりにpost_save `の` pre_save() `信号を使用し`とだけやるpre_saveのフィールドを更新する可能性があることかもしれ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

はい、通常は複数の権利がありますが、そのような場合は「機能」として使用できます。 –