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.