Я пытаюсь создать Django запрос, который будет суммировать несколько категорий в одну отдельную категорию.

У меня есть модель Actuals с полем category, которое является уникальным, и другая модель Budget, которая является полем many to many в модели Actuals. Пользователь может выбрать уникальную категорию в бюджете и выбрать ее в фактах, поэтому в бюджете может быть много фактов. Я пытаюсь создать запрос, который будет группировать и суммировать 'transaction_amount' по категории в модели Actuals.

class Actuals(models.Model):
     category = models.ForeignKey(Category,on_delete=models.CASCADE)
     date = models.DateTimeField(auto_now_add=False)
     transactions_amount = models.IntegerField()
     vendor = models.CharField(max_length = 255,default="")
     details = models.CharField(max_length = 255)
     budget = models.ManyToManyField('budget')

     def __str__(self):
         return self.category.category_feild

Вот запрос, который я имею в настоящее время. Однако он все еще дает мне несколько категорий

lub = Actuals.objects.filter(category__income_or_expense = 'Expense', date__year = "2022" ,date__month = "01").values('category__category_feild','date').order_by('category__category_feild').annotate(total_actuals = Sum('transactions_amount')).annotate(total_budget = Sum('budget__budget_amt'))

Вот вывод. Здесь должна быть только одна строка для "Fun" и одна строка для "Paycheck".

<QuerySet [<Actuals: Fun>, <Actuals: Fun>, <Actuals: Paycheck>, <Actuals: Paycheck>]>
Метод

annotate только добавляет еще один атрибут к объектам, возвращаемым в кверисете. Если вы хотите получить в результате один объект, вам следует использовать метод aggregate queryset:

lub = Actuals.objects.filter(category__income_or_expense='Expense', date__year="2022" ,date__month="01").order_by('category__category_feild').aggregate(total_actuals=Sum('transactions_amount'), total_budget=Sum('budget__budget_amt'))

Для получения значений результатов используйте:

total_actuals = lub['total_actuals']
total_budget = lub['total_budget']

Этот код не тестировался, поэтому дайте мне знать, если он работает.

Также category__category_feild это опечатка, или?

PS. если вам интересно, почему я не использовал values, смотрите этот антипаттерн

Вернуться на верх