2011-05-23 8 views
15

私は関連するモデルを保存するときに多対多のモデルを更新しようとしています。これはm2m_changed signalを使用して行う必要があります(それは動作しますが、管理者では動作しません)。Django admin m2m_changed信号でpost_removeアクションを送信しないで保存

# i want the references field to update when related model is saved. 
# so just call count_references 

class Tag(models.Model): 
    """Group everything into categories""" 
    # stuff stuff stuff 
    references = models.IntegerField(default=0, editable=False) 

    def count_references(self): 
     # just add up references each time to save headaches 
     self.references = 0 
     # search for reverse managers 
     sets = re.compile('^\w+_set$') 
     for rel_set in [method for method in dir(self) if sets.match(method)]: 
      self.references += getattr(self, rel_set).count() 
     self.save() 

class Entry(models.Model): 
    """Blog entry""" 
    # stuff stuff stuff 
    tags = models.ManyToManyField('Tag', blank=True) 

# this will call count_references when entry adds or removes tags 

@receiver(m2m_changed, sender=Entry.tags.through) 
def update_tag_ref_count(sender, instance, action, reverse, model, pk_set, **kwargs): 
    print action 
    if not reverse and action == 'post_add' or action == 'post_remove': 
     for tag_pk in pk_set: 
      print tag_pk 
      Tag.objects.get(pk=tag_pk).count_references() 
      print Tag.objects.get(pk=tag_pk).references 

シェルで実行するとすべてが正常に動作します。例えばそのようなtests.pyと:

t = Tag.objects.all()[0] 
s = Snippet.objects.all()[0] 

s.tags.remove(t) 
s.save() 

s.tags.add(t) 
s.save() 

私が手に、次の( 'テスト' の印刷されているタグ名です):

pre_remove 
post_remove 
test 
0 
pre_add 
post_add 
test 
1 

完璧!また、管理者のエントリにタグを追加すると、次のようになります(HTTPの間):

pre_clear 
post_clear 
pre_add 
post_add 
test 
1 

まだ良いです!どのpre/post_clearが呼び出されたのかわからない...と削除するとき:

pre_clear 
post_clear 

argh! pre/post_removeは呼び出されません! pre/post_clearは、主キーを提供しないだけでなく、役に立たない。これは管理者実装のバグのように感じます。助言がありますか?

更新Bug #16073が提出し、受け入れました。

+1

質問にお答えください。 – jpic

+0

バグは[#6707](https://code.djangoproject.com/ticket/6707)の重複としてマークされています。元の問題の症状です。 – rbanffy

答えて

2

(「未回答」質問としてこれを閉じるためにコミュニティのwikiとしてこれを作成しています。)

これは、Djangoのバグです。 OPはチケットをhttps://code.djangoproject.com/ticket/16073に提出しました。

+0

申し訳ありませんが、しばらくこれをチェックしていません。回答ありがとうございます。 –

関連する問題