django 如何获得CartItem模型的总价列?

yhxst69z  于 2022-12-01  发布在  Go
关注(0)|答案(2)|浏览(136)

第一个
我正在尝试获取将显示在结帐页上的自动总价。我想在CartItem模型上添加“total_price”列并设置默认值“item.price * qty”,但当我尝试将此行添加到类中时:

total_price = models.IntegerField(default=item.price)

因为qty默认值是1,但我得到了AttributeError:'ForeignKey'对象没有属性'price'错误
我也试着在类中添加以下内容:

@property
def total_price(self):
  item = self.object.get(product=self.item)
  return self.item.price

但是我不确定哪个模型会有这个属性?而且当我添加这个方法时,我丢失了total_price列,我将它的默认值设置为0。我为解决方案的质量不足而道歉!

nnvyjq4y

nnvyjq4y1#

您的方向是正确的。您可以尝试annotation or aggregation以获得总价。以下是一种方法:
对于使用带Sum的注解的所有购物车项目:

Cart.objects.all().annotate(total_spent=Sum(
                    F('cartitem__item__price') * 
                    F('cartitem__qty'),   
                    output_field=models.FloatField()
                ))

对于一个购物车,您可以尝试使用聚合,如下所示:

class Cart(...):
   ....

    @property
    def total_price(self):
      return self.cartitem_set.aggregate(price=Sum(
                        F('item__price') * 
                        F('qty'),   
                        output_field=models.FloatField()
                        )['price']
xytpbqjk

xytpbqjk2#

将total_price属性更改为:

class CartItem(models.Model):
    cart = models.ForeignKey(Cart, null=True, on_delete=models.CASCADE, 
    related_name="orders") 
    
    @property
    def total_price(self):
        return self.qty * self.item.price

并且您可以轻松地得到订单项目的总价。
如果你想得到所有CartItems价格的总金额可以做如下:

class Cart(models.Model):

    @property
    def total_amount(self):
        self.orders.annotate(total_spent=Sum(
                F('item__price') * 
                F('qty'),   
                output_field=models.FloatField()
            ))

相关问题