latest - tutorial django
Cómo cambiar el nombre de los elementos en los valores() en Django? (5)
Estoy trabajando con django 1.11.6
(Y el par clave: valor es opuesto al de la respuesta aceptada)
Así es como lo estoy haciendo funcionar para mi proyecto
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
Tenga en cuenta que agregar objetos simultáneos.filter (). Extra (). Values () es el mismo que el anterior.
Quiero hacer más o menos lo mismo en este boleto en djangoproject.com , pero con algún formato adicional. De esta consulta
>>> MyModel.objects.values(''cryptic_value_name'')
[{''cryptic_value_name'': 1}, {''cryptic_value_name'': 2}]
Quiero obtener algo así:
>>> MyModel.objects.values(renamed_value=''cryptic_value_name'')
[{''renamed_value'': 1}, {''renamed_value'': 2}]
¿Hay otra forma más integrada o debo hacerlo manualmente?
Desde django>=1.8
puedes usar anotaciones y objetos F
from django.db.models import F
MyModel.objects.annotate(renamed_value=F(''cryptic_value_name'')).values(''renamed_value'')
También extra()
va a ser desaprobado, de los documentos django:
Esta es una antigua API que pretendemos desaprobar en algún momento en el futuro. Úselo solo si no puede expresar su consulta utilizando otros métodos de consulta. Si necesita usarlo, presente un ticket usando la palabra clave QuerySet.extra con su caso de uso (consulte primero la lista de tickets existentes) para que podamos mejorar la API QuerySet para permitir la eliminación de extra (). Ya no mejoramos ni corregimos errores para este método.
Es más que simple si quiere cambiar el nombre de algunos campos del modo.
Tratar
projects = Project.objects.filter()
projects = [{''id'': p.id, ''name'': ''%s (ID:%s)'' % (p.department, p.id)} for p in projects]
Aquí no tengo un campo de name
en la tabla, pero puedo obtenerlo después de ajustarlo un poco.
Es un poco raro, pero podrías usar el método extra
:
MyModel.objects.extra(select={''renamed_value'': ''cryptic_value_name''}).values(''renamed_value'')
Básicamente esto SELECT cryptic_value_name AS renamed_value
en el SQL.
Otra opción, si siempre quiere la versión renombrada, pero el db tiene el nombre críptico, es nombrar su campo con el nuevo nombre, pero use db_column
para referirse al nombre original en el db.
Sin utilizar ningún otro método de administrador (Probado en v1.11
):
MyModel.objects.values(renamed_value=models.F(''cryptic_value_name''))