Django Подзапрос ORM в аннотации для правильного расчета - PullRequest
0 голосов
/ 09 мая 2020

Это мои модели:

class Consume(models.Model):
    amount = models.FloatField(default=1)
    entry_for = models.ForeignKey(
        Person,
        on_delete=models.SET_NULL,
        related_name='consume_entry_for',
    )


class Purchase(models.Model):
    amount = models.DecimalField(
        max_digits=6,
        decimal_places=2,
        default=0.00
    )
    entry_for = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
        related_name='ledger_entry_for',
    )

и это текущий мой запрос, но он возвращает неправильный расчет:

person_wise_total = Person.objects.annotate(
            total_purchase=Coalesce(Sum('ledger_entry_for__amount'), Value(0)),
            total_consume=Coalesce(Sum('consume_entry_for__amount'), Value(0)),
            difference=Coalesce(Sum('ledger_entry_for__amount'), Value(0)) - Coalesce(Sum('consume_entry_for__amount'), Value(0))
        )

Например, у меня есть запись в Purchase

amount: 2, entry_for: jhon,
amount: 3, entry_for: smith
amount: 5, entry_for: jhon,
amount: 1, entry_for: jhon,

и consume запись:

amount: 1, entry_for: jhon,
amount: 2, entry_for: smith,

Согласно приведенным выше данным, мой запрос Sum должен вернуть total_consume для jhon - 1, но он возвращает 3 для jhon в total_consume и smith total_consume - 2, здесь ожидается результат smith, но результат jhon неожиданный.

Я обнаружил, что проблема / неправильный расчет, возникающий из-за того, что jhon имеет запись 3 в разделе «Покупка» таблица, поэтому она умножается на общую запись покупки человека и общую сумму потребления. вот django официальный объясняет причину дает неправильный расчет

Я слышал о Subquery и Outerref, что я могу правильно получить результат расчета, я прочитал django подзапрос и документация externalRef , но я не смог этого сделать.

Может ли кто-нибудь помочь мне, как я могу получить правильный вычисленный результат?

Я хочу, он должен вернуть ,

jhon's total_purchase: 8, total_consume: 1, difference: 7
smith's total_purchase: 3, total_consume: 2, difference:1

может ли кто мне помочь в случае?

...