как сложить все суммы? - PullRequest
1 голос
/ 22 сентября 2019

Я уже вычислил, общее количество одного потребления, теперь я просто хочу суммировать все потребления

class Consommation(models.Model):
    food = models.ManyToManyField(Food)
    consomme_le = models.DateTimeField(default=timezone.now, editable=False)
    vipcustomer = models.ForeignKey(VipCustomer, models.CASCADE, null=True, 
    blank=True, verbose_name='Client prestigieux', 
    related_name='vip_consommations')

, чтобы вычислить одно потребление:

def total(self):
     return self.food.aggregate(total=Sum('price'))['total']

Класс питания:

class Food(models.Model):
    nom = models.CharField(max_length=100, verbose_name='Mon menu')
    price = models.PositiveIntegerField(verbose_name='Prix')
    category = models.ForeignKey(FoodCategory, models.CASCADE, 
    verbose_name="Categorie")

Класс vipcustomer:

class VipCustomer(models.Model):
    first_name = models.CharField(max_length=150, verbose_name='Prénom')
    last_name = models.CharField(max_length=100, verbose_name='Nom')
    matricule = models.PositiveIntegerField(verbose_name='Matricule', 
    default=0)
    adresse = models.CharField(max_length=200, verbose_name='Adresse', 
    blank=True)
    telephone = PhoneField()
    company = models.CharField(max_length=100, verbose_name='La société')
    service = models.CharField(max_length=100, verbose_name='Service', 
    null=True, blank=True)
    numero_badge = models.IntegerField(verbose_name='Numero du badge', 
    null=True, blank=True)

Моя цель - подсчитать сумму всех завершений.

1 Ответ

1 голос
/ 22 сентября 2019

Для данного VipCustomer s вы можете запросить с помощью:

my_vip_customer.<b>vip_consommations</b>.aggregate(
    <b>total=Sum('food__price')</b>
)['total']

Таким образом, мы агрегируем по набору связанных Consommation s, а затем агрегируем по всемсоответствующие Food с этих Consommation с и соответствующие им price.

Если нет связанных Consommation с или нет связанных Food с этих Consommation с,тогда сумма вернется None вместо 0.Мы можем добавить or 0 для преобразования None в 0 здесь:

my_vip_customer.vip_consommations.aggregate(
    total=Sum('food__price')
)['total'] <b>or 0</b>

или для всех Customer с, мы можем аннотировать это с помощью:

VipCustomer.objects.annotate(
    <b>total=Sum('vip_consommations__food__price')</b>
)

Здесь VipCustomer s, которые вытекают из этого, будут иметь дополнительный атрибут .total, который содержит сумму price s связанных Food s связанных Consommation s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...