Eu quero fazer praticamente o mesmo como neste tíquete em djangoproject.com , mas com alguma formatação adicional. Desta consulta
>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]
Eu quero algo assim:
>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]
Existe outra maneira mais embutida ou tenho que fazer isso manualmente?
django
django-orm
Martin
fonte
fonte
values()
. Fonte: code.djangoproject.com/ticket/16735.values(supports__through_tables)
e este hack não (aliás, provavelmente o caso de uso mais óbvio para querer renomear asValuesQuerySet
chaves de dicionário).values('foreignkeymodel__id', 'foreignkeymodel__name')
.De
django>=1.8
você pode usar anotar e objeto FTambém
extra()
será descontinuado, a partir dos documentos do django:fonte
django>=1.8
. Expressões de consulta habilitadasannotate
para aceitar expressões diferentes de agregados. Referência: 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()
são passadosannotate()
em seu nome (consulte docs.djangoproject.com/en/2.2/ref/models/querysets/… ). A resposta comMyModel.objects.values(renamed_value=F('cryptic_value_name'))
é mais simples e mais clara, IMO.Sem usar qualquer outro método de gerenciamento (testado em
v3.0.4
):Trecho da documentação do Django :
fonte
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
mas não vejo como esse método deveria funcionar nesse caso.inv.values(name=F("stock__name"), price=F("price"))
-> A anotação 'preço' entra em conflito com um campo no modeloinv.values('price', name=F("stock__name"))
. Em python, você só pode colocar argumentos nomeados após os não nomeados.Estou trabalhando com Django 1.11.6
(E o par chave: valor é oposto ao da resposta aceita)
É assim que estou fazendo funcionar para o meu projeto
Observe que adicionar objetos simultâneos. Filtro (). Extra (). Valores () é igual ao anterior.
fonte
.extra(select={cryptic_value:ranamed_value})
tem a chave oposta: valor comparado à resposta aceitaÉ mais do que simples se você deseja renomear alguns campos do modo.
Experimentar
Aqui, eu não tenho um
name
campo na tabela, mas posso conseguir isso depois de alguns ajustes.fonte