Я хочу сделать то же самое, что и в этом билете на 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}]
Есть ли другой, более встроенный способ, или мне придется делать это вручную?
django
django-orm
Мартин
источник
источник
values()
. Источник: code.djangoproject.com/ticket/16735.values(supports__through_tables)
и этот хак не делает (кстати, вероятно, наиболее очевидный вариант использования для переименованияValuesQuerySet
ключей dict).values('foreignkeymodel__id', 'foreignkeymodel__name')
.Из
django>=1.8
вы можете использовать аннотацию и объект FТакже
extra()
будет объявлен устаревшим из документации django:источник
django>=1.8
. Выражения запроса позволяютannotate
принимать выражения, отличные от агрегатов. Ссылка: docs.djangoproject.com/en/1.9/releases/1.8/…MyModel.objects.values(renamed_value='cryptic_value_name')
MyModel.objects.values(renamed_value=models.F('cryptic_value_name'))
работаетvalues()
пропускаются черезannotate()
от вашего имени (см docs.djangoproject.com/en/2.2/ref/models/querysets/... ). ОтветMyModel.objects.values(renamed_value=F('cryptic_value_name'))
проще и понятнее, ИМО.Без использования какого-либо другого метода менеджера (проверенного
v3.0.4
):Выдержка из документации Django :
источник
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
но я не понимаю, как этот метод должен работать в таком случае.inv.values(name=F("stock__name"), price=F("price"))
-> Аннотация «цена» конфликтует с полем моделиinv.values('price', name=F("stock__name"))
. В python вы можете помещать именованные аргументы только после безымянных.Я работаю с django 1.11.6
(И пара ключ: значение противоположна принятому ответу)
Вот как я заставляю это работать в моем проекте
Обратите внимание, что добавление одновременных объектов objects.filter (). Extra (). Values () такое же, как указано выше.
источник
.extra(select={cryptic_value:ranamed_value})
него противоположный ключ: значение по сравнению с принятым ответомЭто более чем просто, если вы хотите переименовать несколько полей режима.
Пытаться
Здесь у меня нет
name
поля в таблице, но я могу получить его после небольшой настройки.источник