Ich möchte so ziemlich das Gleiche tun wie in diesem Ticket auf djangoproject.com , aber mit einigen zusätzlichen Formatierungen. Aus dieser Abfrage
>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]
Ich möchte so etwas bekommen:
>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]
Gibt es eine andere, besser eingebaute Möglichkeit oder muss ich dies manuell tun?
django
django-orm
Martin
quelle
quelle
values()
. Quelle: code.djangoproject.com/ticket/16735.values(supports__through_tables)
und dieser Hack nicht (übrigens wahrscheinlich der offensichtlichste Anwendungsfall für den Wunsch, dieValuesQuerySet
.values('foreignkeymodel__id', 'foreignkeymodel__name')
.Von können
django>=1.8
Sie Annotate und F-Objekt verwendenAuch
extra()
wird aus den Django-Dokumenten veraltet sein :quelle
django>=1.8
. Abfrageausdrücke aktiviertannotate
, um andere Ausdrücke als Aggregate zu akzeptieren. Referenz: docs.djangoproject.com/de/1.9/releases/1.8/…MyModel.objects.values(renamed_value='cryptic_value_name')
MyModel.objects.values(renamed_value=models.F('cryptic_value_name'))
Werkevalues()
werdenannotate()
in Ihrem Namen weitergeleitet (siehe docs.djangoproject.com/de/2.2/ref/models/querysets/… ). Die Antwort mitMyModel.objects.values(renamed_value=F('cryptic_value_name'))
ist einfacher und klarer, IMO.Ohne Verwendung einer anderen Manager-Methode (getestet am
v3.0.4
):Auszug aus Django-Dokumenten :
quelle
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
aber ich sehe nicht, wie diese Methode in diesem Fall funktionieren soll.inv.values(name=F("stock__name"), price=F("price"))
-> Die Anmerkung 'Preis' steht in Konflikt mit einem Feld im Modellinv.values('price', name=F("stock__name"))
. In Python können Sie benannte Argumente nur nach unbenannten setzen.Ich arbeite mit Django 1.11.6
(Und das Schlüssel-Wert-Paar ist dem der akzeptierten Antwort entgegengesetzt.)
So mache ich es für mein Projekt
Beachten Sie, dass das Hinzufügen simultaner Objekte.filter (). Extra (). Values () dasselbe wie oben ist.
quelle
.extra(select={cryptic_value:ranamed_value})
hat entgegengesetzten Schlüssel: Wert im Vergleich zu der akzeptierten AntwortEs ist mehr als einfach, wenn Sie einige Felder des Modus umbenennen möchten.
Versuchen
Hier habe ich kein
name
Feld in der Tabelle, aber ich kann das bekommen, nachdem ich ein wenig gezwickt habe.quelle