Djangoの値リストと値


146

Djangoでは、次の2つの違いは何ですか?

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

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

私の目標は、それぞれの下で一意のコメントIDのリストを取得することArticleです。私はドキュメントを読みました(そして実際には両方のアプローチを使用しています)。結果は明らかに似ています。


values_list if self.id in Article.objects.values_list('comment_id', flat=True):を使用すると、辞書にアクセスするために必要な値を使用しながら行うことができます
dnaranjo

1
@dnaranjo-できますが、なぜそうしないのArticle.objects.filter(comment_id=self.id).exists()ですか?
2016年

1
それが別の質問に対する答えです
dnaranjo 2016年

回答:


250

このvalues()メソッドは、辞書を含むQuerySetを返します。

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

このvalues_list()メソッドは、タプルを含むQuerySetを返します。

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

values_list()単一のフィールドで使用している場合、を使用して、flat=True1タプルではなく単一の値のQuerySetを返すことができます。

<QuerySet [1, 2]>

ああ、どのようdistinct()に使用されているかに対して、2つの間に違いはありませんか?
Hassan Baig 2016年

2
いいえ、私はdistinct()別の方法で動作するとは思いません。重要なことは、操作するデータ構造です。
Alasdair、2016年

3
values()リターンQuerySet及びませんlist。によって返されるオブジェクトはのvalues()ように見えますが、場合によってはオブジェクトのように list動作しません。たとえば、「リスト」に変換しない限り、jsonのシリアル化はできません
Abhijit Ghate

@AbhijitGhate良い点、それを明確にするために答えを更新しました。
Alasdair 2018

2
あなたは簡単にからのリターンを変換することができますvalues_listだけで使用することにより、真のPythonのリストにlist機能を:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia

54

値()

dictionaries反復可能オブジェクトとして使用すると、モデルインスタンスではなくを返すQuerySetを返します。

values_list()

list of tuples反復可能オブジェクトとして使用すると、モデルインスタンスではなくを返すQuerySetを返します。

distinct()

eliminate the duplicate要素に使用されます。

例:

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
つまり、次の場合に返される辞書のリストですvalues
Hassan Baig

明確にするために:distinct()データベースからではなく、クエリ結果から重複要素を削除します。
oz19

5

次のようにして、さまざまな値を取得できます。

set(Article.objects.values_list('comment_id', flat=True))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.