2011-05-23 68 views
15

我試圖讓我保存一個相關的模型更新多對多模型。這應該是可能的使用m2m_changed signal(它的工作!但不是在管理員?)例如Django管理員保存不發送與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 

當在shell中運行時,一切都很完美。例如與像這樣一個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 

唉! pre/post_remove不會被調用! pre/post_clear是無用的,它也不提供任何主鍵。這感覺就像管理員實施中的一個錯誤。有什麼建議麼?

更新Bug #16073已提交併接受。

+1

請回答你的問題。 – jpic 2012-02-19 06:46:22

+0

錯誤被標記爲[#6707](https://code.djangoproject.com/ticket/6707)的重複,因爲它是原始問題的症狀。 – rbanffy 2012-02-22 16:59:44

回答

2

(創建這個作爲一個社區維基收出以此爲「懸而未決」的問題。)

這是在Django的錯誤。 OP在https://code.djangoproject.com/ticket/16073提交了一張票。

+0

對不起,有一段時間沒有檢查過。謝謝回答。 – 2012-03-26 03:29:59