Я пытаюсь создать 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
, смотрите этот антипаттерн