Подтвердить что ты не робот

Как переименовать элементы в значениях() в Django?

Я хочу сделать почти то же самое, что и в этот билет на djangoproject.com, но с некоторым дополнительным форматированием. Из этого запроса

>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]

Я хочу получить что-то вроде этого:

>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]

Есть ли другой, более встроенный способ или мне нужно сделать это вручную?

4b9b3361

Ответ 1

Это немного странно, но вы можете использовать extra метод:

MyModel.objects.extra(
  select={
    'renamed_value': 'cryptic_value_name'
  }
).values(
  'renamed_value'
)

Это в основном делает SELECT cryptic_value_name AS renamed_value в SQL.

Другой вариант, если вы всегда хотите переименованную версию, но у базы данных есть загадочное имя, это db_column вашему полю новое имя, но использовать db_column для ссылки на оригинальное имя в базе данных.

Ответ 2

Из django>=1.8 вы можете использовать аннотирование и объект F

from django.db.models import F

MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value')

Кроме того, extra() будет устаревшим из документации django:

Это старый API, который мы стремимся устареть в какой-то момент в будущем. Используйте его, только если вы не можете выразить свой запрос, используя другие методы набора запросов. Если вам нужно его использовать, пожалуйста, отправьте заявку с использованием ключевого слова QuerySet.extra в вашем случае использования (сначала проверьте список существующих заявок), чтобы мы могли улучшить API QuerySet, чтобы разрешить удаление extra(). Мы больше не улучшаем и не исправляем ошибки для этого метода.

Ответ 3

Без использования любого другого метода менеджера (протестировано на v2.0.8):

from django.db.models import F

MyModel.objects.values(renamed_value=F('cryptic_value_name'))

Ответ 4

Я работаю с django 1.11.6

(И пара ключ: значение противоположна принятой ответной ошибке)

Вот как я делаю это для моего проекта

def json(university):
    address = UniversityAddress.objects.filter(university=university)
    address = address.extra(select={'city__state__country__name': 'country', 'city__state__name': 'state', 'city__name': 'city'})
    address = address.values('country', 'state', "city", 'street', "postal_code").get()
    return address

Обратите внимание, что добавление одновременных объектов .filter(). extra(). values ​​() такое же, как указано выше.

Ответ 5

Это более чем просто, если вы хотите переименовать несколько полей в режиме.

Try

projects = Project.objects.filter()
projects = [{'id': p.id, 'name': '%s (ID:%s)' % (p.department, p.id)} for p in projects]

Здесь у меня нет поля name в таблице, но я могу получить это после небольшой настройки.