как вычислить два агрегатных поля в разных запросах: объект 'dict' не имеет атрибута 'имя-переменной' django - PullRequest
0 голосов
/ 05 августа 2020

Мне нужно вычесть между двумя агрегатными полями в двух разных запросах:

class ModelA(models.Model):
    price = models.IntegerField()
    #others
class ModelB(models.Model):
    cost = models.IntegerField()
    #others

paid_price = ModelA.objects.filter(status=True).annotate(
    total_paid = Sum(F('price')),
    #some more fields
        ).aggregate(
            paid = Sum(F('total_paid'))
            #some more fields
        )

paid_costs = ModelB.objects.filter(status=True).annotate(
    total_cost = Sum(F('cost')),
    #some more fields
        ).aggregate(
            t_cost= Sum(F('total_paid')),
            #some more fields
        )

мне нужно вычислить t_cost с paid Я пробовал это final_result = paid_price.paid - paid_costs.t_cost

, но поднял эта ошибка:

объект 'dict' не имеет атрибута 'оплаченный'

есть ли способ этого добиться? примечание : модели не связаны друг с другом

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Метод aggregate() всегда дает результат dict .

Возвращает словарь совокупных значений (средние, суммы, и т. Д. c.), Вычисленных по QuerySet.

, поэтому выражение должно быть,

final_result = paid_price<b>['paid']</b> - paid_costs<b>['t_cost']</b>
1 голос
/ 05 августа 2020

Совокупные результаты - это словари, вам нужно получить рассчитанные значения по ключу

final_result = paid_price['paid'] - paid_costs['t_cost']

Примечание: аннотация к полю, которое является частью модели, ничего не сделает, если у вас нет некоторой группировки (которая Я не вижу в ваших запросах)

Удалите Sum, если вы просто хотите переименовать поле в запросе

ModelA.objects.annotate(
    total_paid=F('price')
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...