Not sure it'll help but I've always used the 'sender' kwarg (I've used it a total of once to be fair):
for example: m2m_changed.connect(update_answer_set_num_answers, sender=AnswerSet.answers.through) On Sep 14, 11:43 am, allyb <beanb...@googlemail.com> wrote: > hi, > > yes, it is called in models.py, and no, it's not indented and neither > is the handler function. > > On Sep 14, 4:28 pm, Jason <goodri...@gmail.com> wrote: > > > Is the m2m_changed() call in the models.py? > > > Also, it looks indented - if it is, it shouldn't be - in other words - > > it doesn't belong to the model. > > > On Sep 13, 1:27 pm, allyb <beanb...@googlemail.com> wrote: > > > > I'm finding it difficult to denormalise a field in a django model. I > > > have: > > > > class AnswerSet(models.Model): > > > title = models.CharField(max_length=255) > > > num_answers = models.PositiveIntegerField(editable=False, > > > default=0) > > > answers = models.ManyToManyField(Answer, > > > through='AnswerSetAnswer') > > > ... > > > > class AnswerSetAnswer(models.Model): > > > answer = models.ForeignKey(Answer) > > > answer_set = models.ForeignKey(AnswerSet) > > > ... > > > > I want num_answers to contain a count of the number of answers in the > > > set. > > > > If 5 answers are initially associated with the AnswerSet "Food" and I > > > edit one so it becomes associated with the AnswerSet "Colours", how > > > can I recalculate the number of answers in the AnswerSet with "Food"? > > > All the signals only seem to send the new data so I can't just > > > override the save method. > > > > I've tried using the m2m_changed signal, but it never gets called when > > > I edit relationships through the admin form. > > > > Here's my code anyway: > > > > def update_answer_set_num_answers(sender, **kwargs): > > > """ > > > Updates the num_answers field to reflect the number of answers > > > associated with this AnswerSet > > > """ > > > print "hello" # > > > never gets here > > > instance = kwargs.get('instance', False) > > > > print "no instance" > > > > if not instance: > > > return > > > > action = kwargs.get('action') > > > > print "action: ", action > > > > if (action != 'pre_remove' and action != 'pre_add' and action ! > > > = 'clear'): > > > return > > > > reverse = kwargs.get('reverse') > > > > if reverse: > > > answer_set = instance.answer_set > > > else: > > > answer_set = instance.answer_set > > > num_answers = > > > AnswerSetAnswer.objects.filter(answer_set=answer_set.id).count() > > > > if (action == 'pre_remove'): > > > num_answers -= int(kwargs.get('pk_set')) > > > elif (action == 'pre_add'): > > > num_answers += int(kwargs.get('pk_set')) > > > elif (action == 'clear'): > > > num_answers = 0 > > > > answer_set.num_answers = num_answers > > > > print 'n a: ', answer_set.num_answers > > > answer_set.save() > > > > m2m_changed.connect(update_answer_set_num_answers, \ > > > AnswerSet.answers.through) > > > > Setting weak=False or weak=True makes no difference. > > > > How can I get the signal to work? > > > > Thanks > > -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.