Как сложить два модельных поля вместе в Django - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю сайт электронной коммерции, и сейчас я занят корзиной покупок.В настоящее время я показываю продукт, количество и дату заказа.Я также хотел бы отображать сумму заказа для каждого заказа.

В настоящее время мои модели выглядят так:

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: Рассчитать сумму значений столбца с помощью запроса , но я не могу понять, как применить ее к моим моделям.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы не упоминаете, в каком контексте вам это нужно, но самое простое, о чем я могу подумать, будет:

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

Обратите внимание, что это не удастся, если либо product, price, либо quantity являются None.


Если вы указали поле в классе Cart:

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

Обратите внимание, что это также не удастся, если order.order_total равно None.

0 голосов
/ 13 февраля 2019

Вы можете переопределить метод сохранения в корзине вашей модели.

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)
...