Django: вычесть общую сумму из двух таблиц, сгруппированных по общему имени группы
Я пытаюсь получить результат из таблицы обмена (приход) (-) таблицы расхода, сгруппированной по счету, но результат умножает Sum * количество строк в другой таблице.
class Account(models.Model):
trip = models.ForeignKey(Trip, default=1, on_delete=models.SET_DEFAULT)
description = models.CharField('Description', max_length=254)
class Exchange(models.Model):
buy_date = models.DateField(verbose_name='Buy Date')
quantity = models.DecimalField(('Quantity'), max_digits=32, decimal_places=2, blank=True, null=True)
quote = models.DecimalField(('Quote'), max_digits=32, decimal_places=2, blank=True, null=True)
total = models.DecimalField(('Total'), max_digits=32, decimal_places=2, blank=True, null=True)
account = models.ForeignKey(Account, default=1, on_delete=models.SET_DEFAULT)
class Expense(models.Model):
start_date = models.DateTimeField(verbose_name='Date')
amount = models.DecimalField(('Amount'), max_digits=32, decimal_places=2, blank=True, null=True)
fee = models.DecimalField(('Fee'), max_digits=32, decimal_places=2, blank=True, null=True, default=0)
total = models.DecimalField(('Total'), max_digits=32, decimal_places=2, blank=True, null=True, default=0)
account = models.ForeignKey(Account, default=1, on_delete=models.SET_DEFAULT)
Я пытался выполнить следующую операцию:
result = (
Account
.objects
.values('description')
.filter(created_by=user)
.filter(trip=selectedtrip_id)
.filter(exchange__quantity__gt=0)
.annotate(exchange_total=Sum('exchange__quantity'),
expense_total=Sum('expense__total')
)
.annotate(account_remain=F('exchange_total') - F('expense_total'))
.order_by('description')
)
Идея заключается в том, чтобы узнать, сколько осталось на счете. Но проблема в том, что когда вы выполняете операцию подобным образом, результатом является общая сумма, умноженная на количество строк в таблице расходов.
Счет 1,Счет01 2,Счет02
Обмен 2023-01-01, 100, 5.0, 500, 1 2023-01-01, 100, 4.9, 490, 1 2023-01-01, 200, 5.1, 510, 1 2023-01-01, 100, 5.0, 500, 2
Расходы 2023-01-10, 10, 1, 11, 1 2023-01-11, 20, 2, 22, 1 2023-01-12, 10, 1, 11, 1 2023-01-13, 20, 2, 22, 2
Результатом должно быть: Счет01 Общее количество обмена: 400 Итого расходов: 44 Остаток: 356
Счет02 Общее количество обмена: 100 Всего расходов: 22 Остаток: 378
НО, истинный результат при использовании этого синтаксиса таков: Счет01 Обменное количество всего: 1200 (3 строки на экспозиции) Расход всего: 132 (3 строки в обмене) Остаток: 1068
Счет02 Общее количество обмена: 100 Всего расходов: 22 Остаток: 78
Кто-нибудь знает, что не так? Я пытался включить distinct=True, но не решил
result = (
Account
.objects
.values('description')
.filter(created_by=user)
.filter(trip=selectedtrip_id)
.filter(exchange__quantity__gt=0)
.annotate(exchange_total=Sum('exchange__quantity', distinct=True),
expense_total=Sum('expense__total', distinct=True)
)
.annotate(account_remain=F('exchange_total') - F('expense_total'))
.order_by('description')
)
Ответ на этот вопрос:
Django multiple table query - преобразование MySQL в Django (Python) запрос