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()
はデータ取得時に不要なフィールドを減らして最適化する強力な機能です!🚀 使用目的に応じてモデルオブジェクトの代わりに辞書でデータを取得するのが非常に便利です! 😊
あ!上記の例の結果を見て、もう気づいている方もいるかもしれませんが、.value()、.value_list()を通じて返される辞書のリストはまだクエリセットです。(遅延評価なので、即時評価が必要な場合はlist()で囲んでください!)
Add a New Comment