further, i tried putting a sender argument in receiver, but the sender , i 
found (by set_trace) is Cart_cartitems, how can i import this <class 
'shoppingcart.models.Cart_cartitems'> when its only a intermediary model 
that django's creating.
On Friday, February 8, 2013 11:26:47 AM UTC+5:30, vijay shanker wrote:
>
> Thanks Evans.That was helpful. :)
>
> On Thursday, February 7, 2013 7:54:36 PM UTC+5:30, Tom Evans wrote:
>>
>> On Thu, Feb 7, 2013 at 1:54 PM, vijay shanker <[email protected]> wrote: 
>> > Hi 
>> > I am using django version 1.4.3 
>> > I am using two signals in my models.py 
>> > one is m2m_changed, so i can have a counter field (numcounter) of 
>> number of 
>> > m2m fields attached, and another is post_save so i can decide whether 
>> to 
>> > have a OneToOneField (cartrule, is to be applied only if there are more 
>> than 
>> > 2 fields) or not. 
>> > my models.py is: 
>> > 
>> > class CartItem(models.Model): 
>> >     content_type    = models.ForeignKey(ContentType) 
>> >     object_id       = models.PositiveIntegerField() 
>> >     content_object  = generic.GenericForeignKey(' 
>> > content_type','object_id') 
>> >     quantity        = models.PositiveIntegerField(default=0) 
>> >     is_abandoned    = models.BooleanField(default=False) 
>> >     created_at      = models.DateTimeField(auto_now_add=True) 
>> >     update_at       = models.DateTimeField(auto_now=True) 
>> >     def __str__(self): 
>> >         return self.content_object.name 
>> > 
>> > class CartRule(models.Model): 
>> >     ##some field 
>> >     pass 
>> > 
>> > class Cart(models.Model): 
>> >     cart_id             = models.CharField(max_length=50, null=False) 
>> >     customer            = 
>> models.ForeignKey(Customer,null=True,blank=True) 
>> >     cartitems           = models.ManyToManyField(CartItem,null=True) 
>> >     created_at          = models.DateTimeField(auto_now_add=True) 
>> >     update_at           = models.DateTimeField(auto_now=True) 
>> >     cartrule               = 
>> > models.OneToOneField(crapclass,null=True,blank=True) 
>> >     num_cartitem        = models.IntegerField() 
>> >     def __str__(self): 
>> >         return self.cart_id 
>> > 
>> > @receiver(post_save, sender=Cart) 
>> > def apply_condition(sender,instance,created,raw,using,*args,**kwargs): 
>> >     # i want to decide here if num_cartitem is greater than 2 its ok to 
>> have 
>> > a cartrule 
>> >     pass 
>> > 
>> > @receiver(m2m_changed) 
>> > def save_cartitem_counter(sender, instance, signal,*args, **kwargs): 
>> >     if kwargs['action'] == 'post_add': 
>> >         instance.num_cartitem = instance.cartitems.all().count() 
>> >         instance.save() 
>> > 
>> > the issue is apply_condition gets called twice, with similar value of 
>> args, 
>> > first with older value of m2m (cartitem) field in Cart, the other time 
>> with 
>> > the values i intended to save 
>> > I looked into older post but still could not figure out the whys.How 
>> should 
>> > i go about this ? 
>> > 
>>
>> When you save a Cart instance, the post_save signal is triggered. 
>> If the M2M relationship is changed as well, then the m2m_changed 
>> signal is triggered. Your handler for this then re-saves the Cart 
>> instance after denormalising data, which triggers the post save signal 
>> for a second time. 
>> You should probably connect the M2M receiver to a specific sender too, 
>> currently it will fire whenever any M2M on any model is changed. 
>>
>> Keeping denormalized data like that is a pain, could you do without 
>> it, and re-calculate it where necessary? 
>>
>> Alternatively, you could use a named intermediary M2M relationship: 
>>
>>
>> https://docs.djangoproject.com/en/1.4/topics/db/models/#intermediary-manytomany
>>  
>>
>> and connect signals on post_create and post_delete to the intermediary 
>> model, updating the Cart as necessary. 
>>
>> This is a little more logical, since you wish to denormalise the data 
>> whenever an item is added to or removed from a cart, ie whenever a row 
>> is added or deleted to the intermediate table. Naming the relationship 
>> allows you to connect the signals to the right place. 
>>
>> Cheers 
>>
>> Tom 
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to