Saya berjuang keras agar kepala saya berada di sekitar ORM Django. Yang ingin saya lakukan adalah mendapatkan daftar nilai berbeda dalam bidang di tabel saya .... yang setara dengan salah satu dari berikut ini:
SELECT DISTINCT myfieldname FROM mytable
(atau sebagai alternatif)
SELECT myfieldname FROM mytable GROUP BY myfieldname
Saya setidaknya ingin melakukannya dengan cara Django sebelum beralih ke sql mentah. Misalnya, dengan tabel:
id, jalan, kota
1, Jalan Utama, Hull
2, Jalan Lain, Hull
3, Bibble Way, Leicester
4, Cara Lain, Leicester
5, Jalan Tinggi, Londidium
Saya ingin mendapatkan:
Hull, Leicester, Londidium.
values_list
sebenarnya tidak mengembalikan daftar. Ini mengembalikan sesuatu seperti queryset. Saya merasa berguna untuk selalu menggunakan list () di sekitar panggilan values_list.values_list
mengembalikan ValuesListQuerySet yang merupakan iterator. Mentransmisikan ke daftar mungkin berguna, tetapi juga dapat menghasilkan performa ketika semua baris harus dievaluasi sekaligus, terutama dengan kumpulan data yang besar.Meta: ordering = ()
"fitur" dari Django orm danobjects.distinct()
vsobjects.ordering().distinct()
menyebabkan kita jam kebingungan. Harus ada stiker peringatan keselamatan konsumen pada produk itu;) Kami dapat menerapkan kebijakan atribut tanpa-Meta-ordering untuk mencegah garuk kepala di masa mendatang.Meta
kelasordering
dan menyelesaikan masalah dengandistinct
menggunakanorder_by()
tanpa parameter. Ini ada di dokumen QuerySet API di bawahorder_by()
" Jika Anda tidak ingin pengurutan apa pun diterapkan ke kueri, bahkan pengurutan default, panggilorder_by()
tanpa parameter. "Selain masih sangat relevan jawaban dari jujule , saya merasa cukup penting untuk juga menyadari implikasi dari
order_by()
padadistinct("field_name")
permintaan. Namun, ini hanya fitur Postgres!Jika Anda menggunakan Postgres dan jika Anda menentukan nama bidang yang kueri harusnya berbeda, maka
order_by()
harus dimulai dengan nama bidang yang sama (atau nama bidang) dalam urutan yang sama (mungkin ada lebih banyak bidang sesudahnya).Jika Anda ingin misalnya mengekstrak daftar kota yang Anda ketahui berbelanja, contoh jujule harus disesuaikan dengan ini:
sumber
Contohnya:
sumber