Djangoの.values()メソッドは、QuerySetを実行する際に特定のフィールドだけを選択して返す機能を持っています。このメソッドを使うと、結果が辞書のリスト(list of dictionaries)形式で返され、全てのモデルフィールドではなく指定したフィールドのみを取得できます。

📌 主な特徴:

  • 一般的なQuerySet(Model.objects.all())はオブジェクト(Modelインスタンス)のリストを返しますが、
  • .values()を使用する場合辞書のリスト(dict list)を返します。

🛠 1. 基本的な使い方

from myapp.models import Post

# 既存のQuerySet(全フィールドを含むモデルインスタンスを返す)
posts = Post.objects.all()  
print(posts)  
# , ]>

# .values()を使用(titleとauthorフィールドのみ取得)
posts = Post.objects.values('title', 'author')  
print(posts)  
# 

📌 違い:

  • Post.objects.all()Postモデルのインスタンスリストを返す
  • Post.objects.values('title', 'author')辞書(dict)リストを返す

🛠 2. .values()のパフォーマンス最適化

.values()を使用すると、不要なフィールドのロードを防ぎクエリパフォーマンスを向上させることができます。つまり、必要なフィールドだけを取得するため、データベースへの負担が減少します。

# 全てのモデルオブジェクトを取得(非効率的)
Post.objects.all()

# 必要なフィールドだけを取得(効率的)
Post.objects.values('title', 'author')

🛠 3. .values().values_list()の違い

.values() → 辞書(dict)リストを返す

Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': '最初の投稿'}, {'id': 2, 'title': '2番目の投稿'}]>

.values_list() → タプル(tuple)リストを返す

Post.objects.values_list('id', 'title')
# <QuerySet [(1, '最初の投稿'), (2, '2番目の投稿')]>

🛠 4. .values()annotate()を組み合わせて使用する

annotate().values()を一緒に使うと、集計(aggregation)されたデータを辞書形式で取得できます。

from django.db.models import Count
from myapp.models import Post, Comment

# 各投稿に対するコメント数を取得
Post.objects.values('title').annotate(comment_count=Count('comments'))

🛠 5. .values()を使用したフィルタリング(distinct()と一緒に使用)

例:特定のauthorが作成したすべての投稿のタイトルを取得し、重複を削除する場合:

Post.objects.values('title').filter(author=1).distinct()

📌 結論

  • .values()はQuerySetを辞書(dict)リストに変換し、特定のフィールドだけを取得します。
  • ✅ 不要なフィールドを除外してクエリのパフォーマンスを最適化できます。
  • .values_list()と比較すると、.values()は辞書を返し、.values_list()はタプルを返します。
  • .annotate()と一緒に使用することで、集計データを辞書形式で取得できます。
  • .distinct()と一緒に使用して重複を削除できます。

💡 .values()はデータ取得時に不要なフィールドを減らして最適化する強力な機能です!🚀 使用目的に応じてモデルオブジェクトの代わりに辞書でデータを取得するのが非常に便利です! 😊

Django QuerySet .values() method concept

あ!上記の例の結果を見て、もう気づいている方もいるかもしれませんが、.value().value_list()を通じて返される辞書のリストはまだクエリセットです。(遅延評価なので、即時評価が必要な場合はlist()で囲んでください!)