Django管理员保存不使用m2m_changed信号发送post_remove操作

时间:2011-05-23 03:44:39

标签: django m2m

当我保存相关模型时,我正试图让多个模型更新。这应该可以使用m2m_changed signal(它可以工作!但不在管理员中?),例如。

# 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()

我得到以下内容(其中'test'是要打印的标签名称):

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 个答案:

答案 0 :(得分:2)

(将此作为社区维基创建,将其作为“未答复”的问题结束。)

这是Django中的一个错误。 OP在https://code.djangoproject.com/ticket/16073提交了一张票。