【问题标题】:ValueError: needs to have a value for field "cart" before this many-to-many relationship can be usedValueError:在使用这种多对多关系之前需要字段“cart”的值
【发布时间】:2016-05-26 04:12:09
【问题描述】:

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

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

【问题讨论】:

标签: django django-signals


【解决方案1】:

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

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

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

【讨论】:

  • 感谢m2m_changed 信号正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
相关资源
最近更新 更多