我试图让我保存一个相关的模型更新多对多模型。这应该是可能的使用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已提交并接受。
请回答你的问题。 – jpic 2012-02-19 06:46:22
错误被标记为[#6707](https://code.djangoproject.com/ticket/6707)的重复,因为它是原始问题的症状。 – rbanffy 2012-02-22 16:59:44