Рассчитать среднее значение за каждый месяц - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь подсчитать среднюю сумму за каждый месяц за 13 последних месяцев.

Итак, у меня есть карточка с датой, в которой много сумм, связанных с категорией.

Например, моя карта 1 имеет сумму для категории A, сумму для категории B и сумму для категории C .... Сумма, Карта и Категория имеют свой собственный класс в модели.

Моя цель - рассчитать для одной категории среднюю сумму за каждые 13 в прошлом месяце.

Вот моя модель:

class Card(models.Model):
    date = models.DateField(auto_now_add=False, null=False)
    day = models.IntegerField(null=False)
    comment = models.TextField(null=False)
    worked = models.BooleanField(default=True)

    def __str__(self):
        return "<id={}, date={}, day={}, comment={}, worked={}>".format(
        self.id,
        self.date,
        self.day,
        self.comment,
        self.worked
    )


class Category(models.Model):
    name = models.CharField(max_length=100)
    icon = models.CharField(max_length=50)
    order = models.IntegerField(null=False, unique=True)
    image = models.CharField(max_length=255)

    def __str__(self):
        return "<id={}, name={}, icon={}>".format(self.id, self.name, self.icon)


class Amount(models.Model):
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    card = models.ForeignKey(Card, on_delete=models.CASCADE, related_name='amounts')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='amounts')

    def __str__(self):
        return "<id={}, amount={}>".format(self.id, self.amount)

И я действительно понятия не имею, как это сделать.

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 17 сентября 2018

В приведенном ниже решении используется агрегирование Django и Transform , чтобы получить для одной категории с именем category среднее значение сумм за каждый месяц в range(13).Если вам нужно, чтобы это было только за предыдущие 13 месяцев, я бы предложил использовать datetime.timedelta и включить фильтр на card__date__year.Вы также можете объединить фильтры ниже в одну строку, но это будет немного длиннее ...

from django.db.models import Avg
amounts_in_category = Amount.objects.filter(category = category)
for month in range(13):
    amounts_in_month = amounts_in_category.filter(card__date__month = month)
    average_amount_for_month = amounts_in_month.aggregate(Avg('amount'))
...