Django values_list vs values


161

Di Django, apa perbedaan antara dua berikut ini:

Article.objects.values_list('comment_id', flat=True).distinct()

vs.

Article.objects.values('comment_id').distinct()

Tujuan saya adalah mendapatkan daftar id komentar unik di bawah masing-masing Article. Saya telah membaca dokumentasinya (dan sebenarnya telah menggunakan kedua pendekatan tersebut). Hasilnya tampak serupa.


Dengan values_list yang dapat Anda lakukan if self.id in Article.objects.values_list('comment_id', flat=True):saat menggunakan nilai yang Anda perlukan untuk mengakses kamus
— dnaranjo

1
@dnaranjo - Anda bisa, tetapi mengapa tidak melakukannya Article.objects.filter(comment_id=self.id).exists()?
— Sayse

1
Itu adalah jawaban untuk pertanyaan yang berbeda
— dnaranjo

Jawaban:


275

The values()Metode mengembalikan QuerySet mengandung kamus:

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>

The values_list()Metode mengembalikan QuerySet mengandung tupel:

<QuerySet [(1,), (2,)]>

Jika Anda menggunakan values_list()dengan satu bidang, Anda bisa menggunakan flat=Trueuntuk mengembalikan QuerySet nilai tunggal alih-alih 1-tupel:

<QuerySet [1, 2]>

Oh dan tidak ada perbedaan antara keduanya, bagaimana cara distinct()menggunakannya ya?
— Hassan Baig

2
Tidak, menurut saya cara distinct()kerjanya tidak berbeda. Yang penting adalah struktur data mana yang ingin Anda kerjakan.
— Alasdair

3
Hasil values()a QuerySetdan bukan a list. Meskipun objek yang dikembalikan values()terlihat seperti a list, tidak berperilaku seperti itu dalam beberapa kasus. Misalnya, ini tidak akan bisa bersambung json kecuali kita mengubahnya menjadi `daftar '
— Abhijit Ghate

@AbhijitGhate poin bagus, saya telah memperbarui jawaban untuk memperjelasnya.
— Alasdair

2
Anda dapat dengan mudah mengonversi pengembalian dari values_listke daftar Python sebenarnya hanya dengan menggunakan listfungsi:list(Article.objects.values_list('comment_id', flat=True).distinct())
— inostia

61

nilai ()

Mengembalikan QuerySet yang mengembalikan dictionaries, bukan contoh model, saat digunakan sebagai iterable.

values_list ()

Mengembalikan QuerySet yang mengembalikan list of tuples, bukan contoh model, saat digunakan sebagai iterable.

berbeda()

berbeda digunakan untuk eliminate the duplicateelemen.

Contoh:

Article.objects.values_list('id', flat=True) # flat=True will remove the tuples and return the list   
[1, 2, 3, 4, 5, 6]

Article.objects.values('id')
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]

2
Jadi ini adalah daftar kamus yang dikembalikan dalam kasusvalues
— Hassan Baig

1
Hanya untuk memperjelas: distinct()menghilangkan elemen duplikat dari hasil kueri, bukan dari database.
— oz19

6

Anda bisa mendapatkan nilai yang berbeda dengan:

set(Article.objects.values_list('comment_id', flat=True))

Ini akan jauh lebih lambat daripada menggunakan distinct()untuk menghilangkan duplikat di tingkat database.
— Alexander Suraphel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.