Django değerleri_listesi - değerler


146

Django'da, aşağıdaki ikisi arasındaki fark nedir:

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

vs

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

Amacım, her birinin altında benzersiz yorum kimlikleri listesi almaktır Article. Belgeleri okudum (ve aslında her iki yaklaşımı da kullandım). Sonuçlar açıkça benzer görünmektedir.


Değerler listesini if self.id in Article.objects.values_list('comment_id', flat=True):kullanarak, sözlüğe erişmeniz gereken değerleri kullanırken yapabilirsiniz
dnaranjo

1
@dnaranjo - Yapabilirsin ama neden sadece yapmıyorsun Article.objects.filter(comment_id=self.id).exists()?
Sayse

1
Bu farklı bir sorunun cevabı
dnaranjo

Yanıtlar:


250

values()Yöntem sözlükleri içeren bir Sorgu Kümesi verir:

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

values_list()Yöntem dizilerini ihtiva eden bir Sorgu Kümesi verir:

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

Eğer kullanıyorsanız values_list()tek alanıyla kullanabileceğiniz flat=Trueyerine 1-dizilerini tek bir değerler Sorgu Kümesi dönmek için:

<QuerySet [1, 2]>

Oh ve iki vis-a-vis arasında hiçbir fark nasıl distinct()kullanılır ha?
Hassan Baig

2
Hayır, distinct()farklı çalıştığını düşünmüyorum . Önemli olan hangi veri yapısıyla çalışmak istediğinizdir.
Alasdair

3
A values()değerini QuerySetdeğil a değerini döndürür list. Nesne tarafından döndürülen rağmen values()bir benzeri görünüyor list, bazı durumlarda biri gibi davranmaz. Örneğin, bir listeye dönüştürmediğimiz sürece json serileştirilemez
Abhijit Ghate

@AbhijitGüzel bir nokta, cevabı daha açık hale getirmek için güncelledim.
Alasdair

2
values_listSadece listfonksiyonunu kullanarak dönüşü gerçek bir Python listesine kolayca dönüştürebilirsiniz :list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia

55

değerleri ()

dictionariesYinelenebilir olarak kullanıldığında model örnekleri yerine döndüren bir Sorgu Kümesi döndürür.

values_list ()

list of tuplesYinelenebilir olarak kullanıldığında model örnekleri yerine döndüren bir Sorgu Kümesi döndürür.

tat ()

eliminate the duplicateelementler için ayrı kullanılır .

Misal:

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
Yani bu durumda geri dönen sözlüklerin bir listesivalues
Hassan Baig

Sadece açıklığa kavuşturmak için: distinct()yinelenen öğeleri veritabanından değil, sorgu sonuçlarından kaldırır.
oz19

5

Farklı değerleri aşağıdakilerle elde edebilirsiniz:

set(Article.objects.values_list('comment_id', flat=True))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.