我使用以下代码来解决问题:
class Cart(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
items = models.ManyToManyField(CC, blank=True)
total = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
def __str__(self):
return self.user.username
@receiver(pre_save, sender=Cart)
def cart_update_total(sender, instance, *args, **kwargs):
total = Decimal(0.00)
for item in instance.items.all():
total += item.price
instance.total = total
@receiver(user_activated)
def user_created(sender, user, request, **kwargs):
cart, created = Cart.objects.get_or_create(user=user)
所以基本上我为激活帐户的用户创建了一个Cart
模型。但我也在pre_save
使用Cart
信号来计算购物车中产品的总价格。因此pre_save
函数尝试访问尚未保存的对象的字段。你能告诉我如何修改这个逻辑以使其正常工作?
答案 0 :(得分:0)
我认为pre_save
或post_save
无法做到这一点,因为在实际的Cart
对象存在之前,m2m字段将无法访问。
当人们使用m2m_changed
signal添加/删除现有购物车中的商品时,您可以访问items
字段。因此,每次用户更新购物车时,都会触发此方法并更新总计。
我认为在创建购物车时计算总数不是很有意义,因为,如果您没有购物车,那么如何添加商品呢?我会将这两个流程分开,让用户先创建一个购物车然后再购物,但这取决于你的业务逻辑来做出决定。