Django @property используется в .aggregate () - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь собрать список целых чисел из модели. Поле, из которого получены целые числа, является полем декоратора @property. Декоратор работает как положено и в пределах template.html, если передается напрямую, отображается без проблем. Однако, если я пытаюсь пропустить поле @property через .aggregate() контекст, переданный в template, выдает ошибку, которая в основном говорит Cannot resolve keyword 'sum_thing' into field., сопровождаемую списком полей модели, которые не включают ни одно из полей декоратора ,

Мой вопрос: как вы агрегируете (суммируете) производные поля из модели?

#models.py

class Foo(models.Model):
    a = 10      # a & b are both
    b = 5       # models.IntegerField() items

    @property
    def sum_thing(self):
        return self.a - self.b

#views.py

class Bar(generic.ListView):

    def get_context_data(self, **kwargs):

        qs = Foo.object.all()

        totals = {}

        totals['sumthing'] = qs.aggregate(total=Sum('sum_thing')

        context = {
            'totals': totals
        }

        return context

** Я значительно упростил models.py и views.py.

1 Ответ

0 голосов
/ 15 мая 2018

Вы не можете агрегировать, используя свойства, так как они не существуют в БД.Но вы можете аннотировать ваш запрос с помощью выражений F Джанго, чтобы получить фактическое значение для этих полей.См. Пример ниже.

from django.db.models import F, Sum

Foo.objects.annotate(sum_a_and_b=F('a') + F('b')).aggregate(total=Sum('sum_a_and_b'))

Также вы можете выполнить любую математическую операцию, например / * + - с F, также вы можете сделать это

.annotate(answer=F('a') + F('b') * 2)
...