Django では、データベースのクエリをシンプルに記述できるように モデルマネージャ(Manager) と クエリセット(QuerySet) が提供されています。
しかし、デフォルトの objects
マネージャだけでは、特定の条件でデータを取得する場合に冗長なコードになりがちです。
そこで、カスタムの モデルマネージャ と クエリセット を作成し、データ取得を効率化する方法を紹介します。
Django の models.Manager
を拡張することで、モデルごとに 独自のクエリメソッド を定義できます。
例えば、有効なデータのみを取得するマネージャ を作成する場合、以下のように定義します。
PYTHONfrom django.db import models class ActiveManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_active=True)
このカスタムマネージャをモデルに適用します。
PYTHONclass Item(models.Model): name = models.CharField(max_length=100) is_active = models.BooleanField(default=True) objects = models.Manager() # デフォルトのマネージャ active_objects = ActiveManager() # カスタムマネージャ
✅ ポイント
objects
は 全データを取得(デフォルト)active_objects
は is_active=True
のデータのみ取得PYTHONall_items = Item.objects.all() # すべてのアイテム active_items = Item.active_objects.all() # is_active=True のアイテムのみ取得
カスタムマネージャに直接フィルタを追加すると、メソッドチェーン(.filter().exclude()
など)が使えなくなります。
これを解決するために、カスタムクエリセット(QuerySet) を作成します。
PYTHONclass ItemQuerySet(models.QuerySet): def active(self): return self.filter(is_active=True) def expensive(self, price): return self.filter(price__gte=price)
PYTHONclass ItemManager(models.Manager): def get_queryset(self): return ItemQuerySet(self.model, using=self._db) def active(self): return self.get_queryset().active() def expensive(self, price): return self.get_queryset().expensive(price)
PYTHONclass Item(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) is_active = models.BooleanField(default=True) objects = ItemManager() # カスタムマネージャ
PYTHONactive_items = Item.objects.active() # is_active=True のアイテム expensive_items = Item.objects.expensive(1000) # 1000円以上のアイテム
✅ メリット
.filter()
を毎回書く必要がなくなる。Item.objects.active().expensive(1000)
など)。objects.get_queryset()
をオーバーライドすることで、デフォルトのクエリセットを変更できる。回 | タイトル | リンク |
---|---|---|
第 1 回 | Django: モデルの高度なフィールドとオプション | 詳 細 |
第 2 回 | Django: クエリ最適化 | 詳 細 |
第 3 回 | Django: カスタムモデルマネージャとクエリセット | この記事 |
第 4 回 | Django: シグナルを活用したイベント処理 | 詳 細 |
第 5 回 | Django: キャッシュとパフォーマンス最適化 | 詳 細 |
第 6 回 | Django: タイムゾーン・言語設定 | 詳 細 |
第 7 回 | Django: 日時処理(timezone の活用) | 詳 細 |
第 8 回 | Django: QuerySet 基本メソッド① | 詳 細 |
第 9 回 | Django: QuerySet 基本メソッド② | 詳 細 |
第 10 回 | Django: QuerySet の集計メソッド | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。