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_save
或 post_save
无法做到这一点,因为在实际 Cart
对象存在之前无法访问 m2m 字段。
当人们使用 m2m_changed
signal 从现有购物车中 add/remove 件商品时,您可以访问 items
字段。所以每次用户更新购物车时,都会触发此方法并更新总数。
我认为在创建购物车时计算总数没有多大意义,因为,如果没有购物车,如何向其中添加商品?我会将这两个流程分开,让用户先创建购物车,然后再购物,但这取决于您的业务逻辑。
我遇到了以下代码的问题:
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_save
或 post_save
无法做到这一点,因为在实际 Cart
对象存在之前无法访问 m2m 字段。
当人们使用 m2m_changed
signal 从现有购物车中 add/remove 件商品时,您可以访问 items
字段。所以每次用户更新购物车时,都会触发此方法并更新总数。
我认为在创建购物车时计算总数没有多大意义,因为,如果没有购物车,如何向其中添加商品?我会将这两个流程分开,让用户先创建购物车,然后再购物,但这取决于您的业务逻辑。