ValueError:需要为字段" cart"在此之前可以使用多对多关系

时间:2016-05-25 18:39:41

标签: django django-signals

我使用以下代码来解决问题:

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函数尝试访问尚未保存的对象的字段。你能告诉我如何修改这个逻辑以使其正常工作?

1 个答案:

答案 0 :(得分:0)

我认为pre_savepost_save无法做到这一点,因为在实际的Cart对象存在之前,m2m字段将无法访问。

当人们使用m2m_changed signal添加/删除现有购物车中的商品时,您可以访问items字段。因此,每次用户更新购物车时,都会触发此方法并更新总计。

我认为在创建购物车时计算总数不是很有意义,因为,如果您没有购物车,那么如何添加商品呢?我会将这两个流程分开,让用户先创建一个购物车然后再购物,但这取决于你的业务逻辑来做出决定。