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.

Reply via email to