Chcę zrobić prawie to samo, co na tym bilecie na djangoproject.com , ale z dodatkowym formatowaniem. Z tego zapytania
>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]
Chcę dostać coś takiego:
>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]
Czy jest inny, bardziej wbudowany sposób, czy też muszę to zrobić ręcznie?
django
django-orm
Jaskółka oknówka
źródło
źródło
values()
. Źródło: code.djangoproject.com/ticket/16735.values(supports__through_tables)
i ten hack nie (nawiasem mówiąc, prawdopodobnie najbardziej oczywisty przypadek użycia zmiany nazwyValuesQuerySet
klawiszy dyktowania).values('foreignkeymodel__id', 'foreignkeymodel__name')
.Od
django>=1.8
można użyć opisywanie i przedmiot FRównież
extra()
zostanie wycofane z dokumentacji django:źródło
django>=1.8
. Wyrażenia zapytańannotate
mogą akceptować wyrażenia inne niż agregaty. ŹródłaMyModel.objects.values(renamed_value='cryptic_value_name')
MyModel.objects.values(renamed_value=models.F('cryptic_value_name'))
działavalues()
są przekazywaneannotate()
w Twoim imieniu (patrz docs.djangoproject.com/en/2.2/ref/models/querysets/ ... ). OdpowiedźMyModel.objects.values(renamed_value=F('cryptic_value_name'))
jest prostsza i bardziej przejrzysta, IMO.Bez użycia innej metody menedżera (przetestowane
v3.0.4
):Fragment z dokumentacji Django :
źródło
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
ale nie widzę, jak ta metoda powinna działać w takim przypadku.inv.values(name=F("stock__name"), price=F("price"))
-> Adnotacja „cena” koliduje z polem na modeluinv.values('price', name=F("stock__name"))
. W Pythonie możesz umieścić nazwane argumenty tylko po nienazwanych argumentach.Pracuję z django 1.11.6
(A klucz: para wartości jest odwrotna do akceptowanej odpowiedzi)
W ten sposób pracuję nad moim projektem
Zwróć uwagę, że dodawanie jednoczesnych obiektów .filter (). Extra (). Wartości () jest takie samo jak powyżej.
źródło
.extra(select={cryptic_value:ranamed_value})
ma odwrotny klucz: wartość w porównaniu z zaakceptowaną odpowiedziąTo więcej niż proste, jeśli chcesz zmienić nazwę kilku pól trybu.
Próbować
Tutaj nie mam
name
pola w tabeli, ale mogę to uzyskać po drobnych poprawkach.źródło