Quiero hacer más o menos lo mismo que en este ticket en djangoproject.com , pero con un formato adicional. De esta consulta
>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]
Quiero conseguir algo como eso:
>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]
¿Existe otra forma más integrada o tengo que hacerlo manualmente?
django
django-orm
Martín
fuente
fuente
values()
. Fuente: code.djangoproject.com/ticket/16735.values(supports__through_tables)
y este truco no lo hace (por cierto, probablemente el caso de uso más obvio para querer cambiar el nombre de lasValuesQuerySet
claves de.values('foreignkeymodel__id', 'foreignkeymodel__name')
.Desde
django>=1.8
puede usar anotar y objeto FTambién
extra()
estará obsoleto, de los documentos de django:fuente
django>=1.8
. Expresiones de consulta habilitadasannotate
para aceptar expresiones distintas de agregados. Referencia: 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'))
obrasvalues()
se transmitenannotate()
en su nombre (consulte docs.djangoproject.com/en/2.2/ref/models/querysets/… ). La respuesta conMyModel.objects.values(renamed_value=F('cryptic_value_name'))
es más simple y más clara, en mi opinión.Sin usar ningún otro método de administrador (probado en
v3.0.4
):Extracto de los documentos de Django :
fuente
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
pero no veo cómo debería funcionar este método en ese caso.inv.values(name=F("stock__name"), price=F("price"))
-> La anotación 'precio' entra en conflicto con un campo en el modeloinv.values('price', name=F("stock__name"))
. En Python, solo puede colocar argumentos con nombre después de los que no tienen nombre.Estoy trabajando con django 1.11.6
(Y el par clave: valor es opuesto al de la respuesta aceptada)
Así es como lo hago funcionar para mi proyecto
Tenga en cuenta que la adición simultánea de objects.filter (). Extra (). Values () es igual que el anterior.
fuente
.extra(select={cryptic_value:ranamed_value})
tiene la clave opuesta: valor en comparación con la respuesta aceptadaEs más que simple si desea cambiar el nombre de algunos campos del modo.
Tratar
Aquí no tengo un
name
campo en la tabla, pero puedo obtenerlo después de ajustarlo un poco.fuente