How to rename items in values() in Django?

给你一囗甜甜゛ 提交于 2019-11-27 03:02:21
Daniel Roseman

It's a bit hacky, but you could use the extra method:

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

This basically does SELECT cryptic_value_name AS renamed_value in the SQL.

Another option, if you always want the renamed version but the db has the cryptic name, is to name your field with the new name but use db_column to refer to the original name in the db.

From django>=1.8 you can use annotate and F object

from django.db.models import F

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

Also extra() is going to be deprecated, from the django docs:

This is an old API that we aim to deprecate at some point in the future. Use it only if you cannot express your query using other queryset methods. If you do need to use it, please file a ticket using the QuerySet.extra keyword with your use case (please check the list of existing tickets first) so that we can enhance the QuerySet API to allow removing extra(). We are no longer improving or fixing bugs for this method.

Arpit Singh

Without using any other manager method (Tested on v2.0.8):

from django.db.models import F

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

I am working with django 1.11.6

( And the key:value pair is opposite to that of accepted answer )

This is how i am making it work for my project

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

Note that adding simultanous objects.filter().extra().values() is same as above.

Its more than simple if you want to rename few fields of the mode.

Try

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

Here i do not have a name field in the table, but i can get that after tweaking a little bit.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!