繁体   English   中英

如何在Django中将两个模型字段加在一起

[英]How to sum two model fields together in Django

我正在创建一个电子商务网站,此刻我正忙于购物车。 目前,我显示产品,数量和订购日期。 我还想显示每个订单的订单总数。

目前,我的模型如下所示:

models.py

class Store(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=250)
    store_owner = models.ForeignKey(UserAccount, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Product(models.Model):
    product_name = models.CharField(max_length=100)
    price = models.IntegerField(null=True, blank=True)
    description = models.TextField(max_length=250)
    store = models.ForeignKey(Store, on_delete=models.CASCADE)

    def __str__(self):
        return self.product_name


class Cart(models.Model):
    user = models.ForeignKey(UserAccount, on_delete=models.CASCADE)
    order_total = models.IntegerField(null=True, blank=True)
    checked_out = models.BooleanField(default=False)

    def __str__(self):
        return str(self.user)


class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(null=True, blank=True)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    order_date = models.DateTimeField(auto_now=True)
    order_total = models.IntegerField(null=True, blank=True)

    def __str__(self):
        return "{} order".format(self.product)

如何将数量和价格加在一起并将其分配给order_total? 我也无法弄清楚如何动态分配它,因为每个用户的总数都不同。

我看过Django:通过查询计算列值的总和,但我不知道如何将其应用于模型。

有什么建议么?

您可以覆盖模型购物车中的保存方法。

def save(self, *args, **kwargs):
    if not self.id:
      super(Model, self).save(*args, **kwargs)
    else:
      total = 0.0 # should be DecimalField not integer or float for prices
      for item in Order.objects.filter(cart=self.id):
        total += (item.quantity * item.product.price)
      self.order_total = total # again this should be changed to DecimalField
    super(Model, self).save(*args, **kwargs)

或者如果您将带有外键的价格作为产品,则此查询可以解决问题

def save(self, *args, **kwargs):
    if not self.id:
      super(Model, self).save(*args, **kwargs)
    else:
      total = Order.objects.filter(cart=self.id).aggregate(
            total=Sum('price', field="price*quantity")
         )['total']
      self.order_total = total
    super(Model, self).save(*args, **kwargs)

您没有提到需要哪种上下文,但是我能想到的最简单的方法是:

# order is class 'Order'
order.order_total = order.product.price * order.quantity
order.save()

请注意,如果productpricequantity均为“ None ,则此操作将失败。


如果您在Cart类中提到了该字段:

# cart is class 'Cart'
cart.order_total = sum(
    order.order_total
    for order in cart.order_set.all())
cart.save()

请注意,如果order.order_totalNone ,这也会失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM