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.

Reply via email to