Django сложение столбца manytomany
Всем привет!
class Purchases_item(models.Model):
product = models.ForeignKey(Products, on_delete=models.CASCADE, verbose_name='Товар')
quantity = models.PositiveIntegerField(default=0, verbose_name='Кол-во')
price = models.DecimalField(max_digits=150, default=0, decimal_places=0, verbose_name='Цена себестоимости')
total = models.DecimalField(max_digits=150, default=0, decimal_places=0, verbose_name='Общая сумма')
def __str__(self):
return str(self.product)
def save(self, *args, **kwargs):
super(Purchases_item, self).save(*args, **kwargs)
if not self.total:
self.total = self.price * self.quantity
self.save()
class Meta:
ordering = ('product', 'price', 'total')
verbose_name = 'Покупка по позициям'
verbose_name_plural = 'Покупки по позициям'
class Purchases(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateField(auto_now_add=True, verbose_name='Дата')
company = models.CharField(max_length=150, verbose_name='Компания', null=True, blank=True, default=None)
product = models.ManyToManyField(Purchases_item, verbose_name='Товар(ы)')
total_price = models.DecimalField(max_digits=150, decimal_places=0, verbose_name='Общая сумма')
def __str__(self):
return self.company
def save(self, *args, **kwargs):
Ниже приведу пример как я пытался записать и решить этот вопрос
# def delete(self, *args, **kwargs):
# super(Purchases, self).delete(*args, **kwargs)
# if self.quantity == 0:
# self.delete()
class Meta:
ordering = ('date', 'company', 'total_price')
verbose_name = 'Покупка список'
verbose_name_plural = 'Покупки список'
Есть две модели Purchases_item и Purchases, в первую Purchases_item я записываю товар который купили (название товара записано в таблицы с name), его количество цену себестоимости и общую сумму, в Purchases я записываю список купленного товара, там учитывается User который совершил закупку, дату, компанию которая продала этот товар, товар который закупили и его общую сумму.
Вообщем все идет через список покупки то есть модель Purchases
Мне нужно чтобы можно было записать общую сумму путем сложение total из таблицы Purchases_item которая в Purchases как ManyToManyField Как я пытался решить:
def save(self, *args, **kwargs):
super(Purchases, self).save()
if not self.total_price:
self.total_price = self.product.all().aggregate(Sum('total'))
self.save()
elif self.total_price == 0:
self.total_price = self.product.all().aggregate(Sum('total'))
self.save()
Ошибку которую мне выйдет:
["“{'total__sum': None}” value must be a decimal number."]
Решил это
def save(self, *args, **kwargs):
super(Purchases, self).save()
if not self.total_price:
self.total_price = sum(product.total_price for product in self.product.all())
self.save()
elif self.total_price == 0:
self.total_price = sum(product.total_price for product in self.product.all())
self.save()
elif self.total_price != sum(product.total_price for product in self.product.all()):
self.total_price = sum(product.total_price for product in self.product.all())
self.save()