Come rinominare gli elementi in values ​​() in Django?

Voglio fare praticamente lo stesso come in questo ticket su djangoproject.com , ma con qualche formattazione aggiuntiva. Da questa query

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

Voglio ottenere qualcosa del genere:

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

C’è un altro, più integrato o devo farlo manualmente?

È un po ‘hacky, ma potresti usare il metodo extra :

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

In pratica, SELECT cryptic_value_name AS renamed_value in SQL.

Un’altra opzione, se vuoi sempre la versione rinominata, ma il db ha il nome criptico, è quello di dare un nome al tuo campo con il nuovo nome, ma usa db_column per riferirsi al nome originale nel db.

Da django>=1.8 puoi usare annotate e oggetti F

 from django.db.models import F MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value') 

Anche extra() sarà deprecato dai documenti di django:

Questa è una vecchia API che puntiamo a deprecare in futuro. Usalo solo se non puoi esprimere la tua query usando altri metodi di query. Se è necessario utilizzarlo, si prega di presentare un ticket usando la parola chiave QuerySet.extra con il proprio caso d’uso (si prega di controllare prima l’elenco dei biglietti esistenti) in modo da poter migliorare l’API di QuerySet per consentire la rimozione di extra (). Non stiamo migliorando o correggendo bug per questo metodo.

Senza utilizzare alcun altro metodo di gestione (testato su v2.0.8 ):

 from django.db.models import F MyModel.objects.values(renamed_value=models.F('cryptic_value_name')) 

Sto lavorando con django 1.11.6

(E la chiave: coppia di valori è opposta a quella della risposta accettata)

Questo è come lo sto facendo funzionare per il mio progetto

 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 

Si noti che l’aggiunta simultanea di oggetti.filter (). Extra (). Values ​​() è la stessa di sopra.

È più che semplice se si desidera rinominare alcuni campi della modalità.

Provare

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

Qui non ho un campo name nella tabella, ma posso ottenerlo dopo aver modificato un po ‘.