Je veux faire à peu près la même chose que dans ce ticket sur djangoproject.com , mais avec un formatage supplémentaire. À partir de cette requête
>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]
Je veux obtenir quelque chose comme ça:
>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]
Existe-t-il une autre manière plus intégrée ou dois-je le faire manuellement?
django
django-orm
Martin
la source
la source
values()
. Source: code.djangoproject.com/ticket/16735.values(supports__through_tables)
et ce hack ne le fait pas (d'ailleurs probablement le cas d'utilisation le plus évident pour vouloir renommer lesValuesQuerySet
clés dict).values('foreignkeymodel__id', 'foreignkeymodel__name')
.De
django>=1.8
vous pouvez utiliser annoter et objet FVa également
extra()
être obsolète, à partir de la documentation django:la source
django>=1.8
. Les expressions de requête sont activéesannotate
pour accepter des expressions autres que des agrégats. Référence: 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'))
worksvalues()
sont transmisannotate()
en votre nom (voir docs.djangoproject.com/en/2.2/ref/models/querysets/… ). La réponseMyModel.objects.values(renamed_value=F('cryptic_value_name'))
est plus simple et plus claire, IMO.Sans utiliser aucune autre méthode de gestion (testée sur
v3.0.4
):Extrait de la documentation Django :
la source
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
mais je ne vois pas comment cette méthode devrait fonctionner dans ce cas.inv.values(name=F("stock__name"), price=F("price"))
-> L'annotation 'prix' entre en conflit avec un champ sur le modèleinv.values('price', name=F("stock__name"))
. En python, vous ne pouvez placer des arguments nommés qu'après ceux sans nom.Je travaille avec django 1.11.6
(Et la paire clé: valeur est opposée à celle de la réponse acceptée)
C'est ainsi que je le fais fonctionner pour mon projet
Notez que l'ajout simultané de objects.filter (). Extra (). Values () est identique à ci-dessus.
la source
.extra(select={cryptic_value:ranamed_value})
clé est opposée: la valeur par rapport à la réponse acceptéeC'est plus que simple si vous souhaitez renommer quelques champs du mode.
Essayer
Ici, je n'ai pas de
name
champ dans le tableau, mais je peux l'obtenir après avoir peaufiné un peu.la source