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) запрос

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