How to rename items in values() in Django?

DjangoDjango Orm

Django Problem Overview


I want to do pretty much the same like in this ticket at djangoproject.com, but with some additonal formatting. From this query

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

I want to get something like that:

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

Is there another, more builtin way or do I have to do this manually?

Django Solutions


Solution 1 - Django

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.

Solution 2 - Django

Without using any other manager method (tested on v3.0.4):

from django.db.models import F

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

Excerpt from Django docs:

> An F() object represents the value of a model field or annotated > column. It makes it possible to refer to model field values and > perform database operations using them without actually having to pull > them out of the database into Python memory.

Solution 3 - Django

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.

Solution 4 - Django

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.

Solution 5 - Django

Try passing as kwargs:

MyModel.objects.annotate(**{'A B C':F('profile_id')}).values('A B C')

In my case, there were spaces and other special characters included in the key of each value in the result set so this did the trick.

Solution 6 - Django

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMartinView Question on Stackoverflow
Solution 1 - DjangoalejandrodnmView Answer on Stackoverflow
Solution 2 - DjangoArpit SinghView Answer on Stackoverflow
Solution 3 - DjangoDaniel RosemanView Answer on Stackoverflow
Solution 4 - DjangoSudip BhattaraiView Answer on Stackoverflow
Solution 5 - Djangoburhanuddin abbasView Answer on Stackoverflow
Solution 6 - DjangoA.J.View Answer on Stackoverflow