ValueError: needs to have a value for field "cart" before this many-to-many relationship can be used

ValueError: needs to have a value for field "cart" before this many-to-many relationship can be used

我遇到了以下代码的问题:

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

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

当人们使用 m2m_changed signal 从现有购物车中 add/remove 件商品时,您可以访问 items 字段。所以每次用户更新购物车时,都会触发此方法并更新总数。

我认为在创建购物车时计算总数没有多大意义,因为,如果没有购物车,如何向其中添加商品?我会将这两个流程分开,让用户先创建购物车,然后再购物,但这取决于您的业务逻辑。