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.
django
django-models
django-queryset
django-orm
Hassan Baig
sumber
sumber
if self.id in Article.objects.values_list('comment_id', flat=True):
saat menggunakan nilai yang Anda perlukan untuk mengakses kamusArticle.objects.filter(comment_id=self.id).exists()
?Jawaban:
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 menggunakanflat=True
untuk mengembalikan QuerySet nilai tunggal alih-alih 1-tupel:<QuerySet [1, 2]>
sumber
distinct()
menggunakannya ya?distinct()
kerjanya tidak berbeda. Yang penting adalah struktur data mana yang ingin Anda kerjakan.values()
aQuerySet
dan bukan alist
. Meskipun objek yang dikembalikanvalues()
terlihat seperti alist
, tidak berperilaku seperti itu dalam beberapa kasus. Misalnya, ini tidak akan bisa bersambung json kecuali kita mengubahnya menjadi `daftar 'values_list
ke daftar Python sebenarnya hanya dengan menggunakanlist
fungsi:list(Article.objects.values_list('comment_id', flat=True).distinct())
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 duplicate
elemen.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}]
sumber
values
distinct()
menghilangkan elemen duplikat dari hasil kueri, bukan dari database.Anda bisa mendapatkan nilai yang berbeda dengan:
set(Article.objects.values_list('comment_id', flat=True))
sumber
distinct()
untuk menghilangkan duplikat di tingkat database.