Django Суммарное значение метода модели передачи ORM - PullRequest
0 голосов
/ 08 мая 2020

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

class Bill(models.Model):
    user =  models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name='user_bill'
    )
    flat_rent = models.DecimalField(
        max_digits=6,
        decimal_places=2,
        default=0.00
    )
    gas_bill = models.DecimalField(
        max_digits=6,
        decimal_places=2,
        default=0.00
    )

    # Also i have many such decimalField here that calculated in get_total
    ===========================================


    def get_total(self):
        total = self.flat_rent + self.gas_bill
        return total

Я пытаюсь передать это get_total значение метода здесь:

user_wise = User.objects.filter(
            id=request.user.id
        ).aggregate(
            get_total=Sum('user_bill__get_total')
        )

в моем случае мне нужно запрашивать все из user с related_name, поэтому я агрегирую здесь метод модели.

Может ли кто-нибудь помочь, как передать этот метод get_total в аггрегат?

Я не хочу передавать как это. Bill.objects.get(user__id=request.user.id).get_total

Может ли кто-нибудь помочь в этом?

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 08 мая 2020

Вы можете просто сделать так:

from django.db.models import F, Sum

user_wise = Bill.objects.filter(
        user=request.user
    ).annotate(
        get_total=F('flat_rent') + F('gas_bill')
    ).aggregate(
        total=Sum('get_total')
    )

Кроме того, поскольку это связь OneToOne между User и Bill, вам не нужно сложное решение, например этот. Вы можете просто использовать:

user_wise = request.user.user_bill.get_total()
...