Добавлена ​​аннотация Django к полю с дополнительным

Я пытаюсь найти способ добавить аннотацию к двум полям модели, сложенной вместе. Что-то вроде:

total_done = qs.values(
    'ability__ability_name',
).extra(
    select={
        'total_amount': 'effective_value + overage',
    }
).annotate(
    total=Sum('total_amount'),
).values(
    'ability__ability_name', 'total_amount'
).order_by('-total_amount')

Вышеприведенное не работает и выдает ошибку «Не удается преобразовать ключевое слово total_amount в поле». Я уже пробовал решение, указанное здесь: Использование .aggregate() для значения, введенного с помощью .extra(select={...}) в запросе Django? Однако не повезло получить "Не удается преобразовать ключевое слово "total_amount" в поле"

Все, кроме выполнения запроса в необработанном sql, поскольку передаваемая строка запроса может иметь различные фильтры и исключения, уже выполненные для нее, что делает эту перспективу немного сложной. Я также пытаюсь избежать добавления поля в фактическую модель и вычисления его значения во время сохранения, если только это не единственный способ.


person John    schedule 17.05.2011    source источник
comment
'total_heal' не упоминается в вашем запросе, надеюсь, вы имеете в виду total_amount?   -  person Torsten Engelbrecht    schedule 17.05.2011
comment
Недавно у меня была такая же проблема. Из предыдущих вопросов кажется, что это работало раньше - возможно ли (преднамеренно или случайно), что оно было удалено в более поздних версиях ?? Проблема, по-видимому, не в предложении SQL, а в функции агрегата(), поскольку она прекрасно работает, если я напрямую вызываю свойство queryset.total_amount.   -  person Berislav Lopac    schedule 23.03.2012


Ответы (3)


Я думаю, что лучше использовать аннотацию пользователя, чтобы получить значение total_amount:

total_done = qs.values(
'ability__ability_name',
).annotate(
    total_amount=F('effective_value') + F('overage')
    total=Sum('total_amount'),
).values(
    'ability__ability_name', 'total_amount'
).order_by('-total_amount')
person Ghariani Mohamed    schedule 02.09.2017

Попробуйте что-то вроде этого:

total_done = qs.extra(select = {'total_amount': 'SUM(one_column + another_column)'}, )
person yedpodtrzitko    schedule 14.02.2012

Согласно ответу на https://stackoverflow.com/a/4348728/122033 (фактически в комментариях): " Django, конечно же, передает fullName как псевдоним, который не работает с MySQL» — и я думаю, что и с SQLite, который я использовал. :(

person Berislav Lopac    schedule 26.03.2012