Saya ingin melakukan hal yang sama seperti pada tiket ini di djangoproject.com , tetapi dengan beberapa format tambahan. Dari kueri ini
>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]
Saya ingin mendapatkan sesuatu seperti itu:
>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]
Apakah ada cara lain yang lebih builtin atau apakah saya harus melakukan ini secara manual?
django
django-orm
Martin
sumber
sumber
values()
. Sumber: code.djangoproject.com/ticket/16735.values(supports__through_tables)
dan peretasan ini tidak (kebetulan mungkin kasus penggunaan yang paling jelas untuk ingin mengganti namaValuesQuerySet
kunci dict).values('foreignkeymodel__id', 'foreignkeymodel__name')
.Dari
django>=1.8
Anda dapat menggunakan anotasi dan objek F.Juga
extra()
akan ditinggalkan, dari dokumen django:sumber
django>=1.8
. Ekspresi Kueri diaktifkanannotate
untuk menerima ekspresi selain agregat. Referensi: 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'))
karyavalues()
diteruskanannotate()
atas nama Anda (lihat docs.djangoproject.com/en/2.2/ref/models/querysets/… ). Jawabannya denganMyModel.objects.values(renamed_value=F('cryptic_value_name'))
lebih sederhana dan lebih jelas, IMO.Tanpa menggunakan metode manajer lain (diuji pada
v3.0.4
):Kutipan dari dokumen Django :
sumber
MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
inv.annotate(name=F('stock__name')).values('name', "price")
tetapi saya tidak melihat bagaimana metode ini harus bekerja dalam kasus itu.inv.values(name=F("stock__name"), price=F("price"))
-> 'Harga' anotasi bertentangan dengan bidang pada modelinv.values('price', name=F("stock__name"))
. Dalam python Anda hanya dapat meletakkan argumen bernama setelah yang tidak disebutkan namanya.Saya bekerja dengan django 1.11.6
(Dan kuncinya: pasangan nilai berlawanan dengan jawaban yang diterima)
Beginilah cara saya membuatnya berfungsi untuk proyek saya
Perhatikan bahwa menambahkan simultanous object.filter (). Extra (). Values () sama seperti di atas.
sumber
.extra(select={cryptic_value:ranamed_value})
memiliki kunci yang berlawanan: nilai dibandingkan dengan jawaban yang diterimaIni lebih dari sederhana jika Anda ingin mengganti nama beberapa bidang mode.
Mencoba
Di sini saya tidak memiliki
name
kolom di tabel, tetapi saya bisa mendapatkannya setelah sedikit mengutak-atik.sumber