Умножение двух полей в моделях django для получения общего значения, но общее значение не обновляется в базе данных

#python #django #postgresql

#python #django #postgresql

Вопрос:

Моя модель выглядит так. Другие поля обновляются в базе данных, как и ожидалось. Проблема заключается в получении общего значения, хранящегося в базе данных, путем умножения price_per_unit на количество. Есть ли что-то, чего мне не хватает?

 from django.db import models
from django.contrib.auth.models import User
from django.db.models import Sum
from django.db.models import F

class CowData(models.Model):
    title = models.CharField(max_length=20, default="item")
    user = models.CharField( max_length=20, null=False)
    added_on = models.DateField(auto_now_add=True)
    feed = models.CharField(max_length=20, null=True)
    quantity = models.PositiveIntegerField()
    price_per_unit = models.PositiveIntegerField()
    total = models.PositiveIntegerField(blank=True, null=True)
    
 
total = ( CowData.objects
        .filter()
            .aggregate(
                total=Sum('total', field="quantity*price_per_unit")
             )['total']
         )
 
 

Комментарии:

1. Не могли бы вы, пожалуйста, добавить еще немного кода о том, как вы используете модель? Если у вас уже есть quantity и price_per_unit , хранящиеся в вашей базе данных, вероятно, имеет больше смысла создать total свойство или что-то в этом роде. Объяснение того, чего вы хотите достичь и как использовать эти ценности, поможет нам найти хорошее решение.

2. @GlennDJ, спасибо за ответ. Я сделаю все, что в моих силах, чтобы внести ясность. Я пытаюсь разработать приложение для инвентаризации фермы, дневниковая ферма — это одна категория. У меня есть форма django, в которой пользователь должен вводить разные значения, например, в моей модели. Я хотел бы рассчитать общую цену на основе количества и price_per_unit и сохранить ее в поле с именем total для каждой новой записи. Остальное — это просто файл представления, который отображает страницу формы.

3. Хорошо, понял, тогда я собираюсь предложить другой подход в своем ответе.

Ответ №1:

Судя по вашему комментарию, наилучшим подходом является перезапись save метода модели, который позволяет total вычислять значение каждый раз перед сохранением экземпляра. Пример:

 class CowData(models.Model):
    quantity = models.PositiveIntegerField()
    price_per_unit = models.PositiveIntegerField()
    total = models.PositiveIntegerField(blank=True, null=True)

    def save(self, *args, **kwargs):
        self.total = self.price_per_unit * self.quanity
        super(CowData, self).save(*args, **kwargs)