Django: QuerySet 基本メソッド②

Django 4 の実践(データ処理編)

日付:2025年2月19日

目 次

はじめに

Django の QuerySet には、データ取得や更新、削除を効率的に行うための多くのメソッドが用意されています。本記事では、基本的なメソッドに加え、より高度な QuerySet のメソッド を紹介し、実際の活用例を解説します。

この記事で学べること

  • Django の応用的な QuerySet メソッド
  • 効率的なデータ取得・集計方法
  • パフォーマンス向上のためのクエリ最適化手法

1. 応用的なデータ取得メソッド

(1) values()

特定のフィールドのみ取得する場合に使用します。

PYTHON
from myapp.models import Article articles = Article.objects.values('title', 'author') print(list(articles)) # [{'title': 'Django 入門', 'author': 'Taro'}, ...]

(2) values_list()

特定のフィールドのみをタプルのリストとして取得します。

PYTHON
titles = Article.objects.values_list('title', flat=True) print(list(titles)) # ['Django 入門', 'Python 基礎', ...]

(3) only()

指定したフィールドのみ取得し、クエリの最適化を行います。

PYTHON
articles = Article.objects.only('title')

(4) defer()

指定したフィールドを除外して取得し、パフォーマンスを向上させます。

PYTHON
articles = Article.objects.defer('content')

2. 集計・統計メソッド

(5) annotate()

クエリセットに動的なフィールドを追加できます。

PYTHON
from django.db.models import Count authors = Article.objects.annotate(num_articles=Count('author'))

(6) aggregate()

特定のフィールドの統計情報を取得します。

PYTHON
from django.db.models import Avg average_length = Article.objects.aggregate(Avg('word_count'))

3. クエリ最適化メソッド

(7) exists()

指定条件のデータが存在するかを確認します。

PYTHON
if Article.objects.filter(title='Django 入門').exists(): print("記事が存在します!")

(8) bulk_create()

複数のオブジェクトを一括で作成し、データベースへの負荷を軽減します。

PYTHON
Article.objects.bulk_create([ Article(title='Django 高度な使い方'), Article(title='Python の応用'), ])

(9) bulk_update()

一括で複数のレコードを更新します。

PYTHON
articles = Article.objects.filter(category='Django') for article in articles: article.category = 'Web 開発' Article.objects.bulk_update(articles, ['category'])

4. まとめ

メソッド説明
values()特定のフィールドのみ取得
values_list()フィールドをタプルのリストとして取得
only()指定したフィールドのみ取得しクエリ最適化
defer()指定したフィールドを除外しパフォーマンス向上
annotate()クエリセットに動的フィールドを追加
aggregate()クエリセット全体の統計情報を取得
exists()条件を満たすデータが存在するか確認
bulk_create()複数のオブジェクトを一括作成
bulk_update()複数のオブジェクトを一括更新

Django の QuerySet メソッドを適切に活用することで、より効率的で高速なデータ処理が可能になります。