Перезаписать поле в аннотации набора запросов - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть модель django с полями name (строка) и value (целое число). Скажем, мне нужно вернуть набор запросов из объектов {name: ..., value: ...}, причем каждое значение удваивается. Сейчас я пытаюсь сделать следующее:

queryset.annotate(value=F('value') * 2)

Однако django говорит мне, что поле value уже существует.

Я также пытался использовать extra:

queryset.annotate(value_double=F('value') * 2).extra(select={'value': 'value_double'})

, но это также не работает, поскольку value_double не является допустимым полем.

Конечно, в этом случае я мог бы использовать что-то вроде queryset.extra(select={'value': 'value * 2'}), но у меня есть некоторые другие, более сложные случаи, включающие множество функций, когда я действительно не хочу писать sql, но я бы лучше нашел решение в django. Опять же, во всех моих случаях annotate работает отлично, пока я даю результату новое имя.

1 Ответ

0 голосов
/ 26 февраля 2020

Скажите, что ваша модель XYZ с полями name и val. Если вы хотите, чтобы val содержал val * 2, используйте приведенный ниже набор запросов

x = XYZ.objects.values('name').annotate(val=F('val')*2)

print(x)

Результат

<QuerySet [{'name': abc, 'val': 104},...............] 

Если вы хотите, чтобы набор запросов возвращал name, val и doubleval. Вы можете использовать запрос ниже для того же.

x = XYZ.objects.values('name','val',doubleval=F('val')*2)
print(x)

Результат

<QuerySet [{'name': abc, 'val':52,'doubleval': 104},...............] 

Надеюсь, что эта помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...