Django: カスタムモデルマネージャとクエリセット

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

日付:2025年2月18日

目 次

はじめに

Django では、データベースのクエリをシンプルに記述できるように モデルマネージャ(Manager)クエリセット(QuerySet) が提供されています。
しかし、デフォルトの objects マネージャだけでは、特定の条件でデータを取得する場合に冗長なコードになりがちです。
そこで、カスタムの モデルマネージャクエリセット を作成し、データ取得を効率化する方法を紹介します。

1. カスタムモデルマネージャとは?

Django の models.Manager を拡張することで、モデルごとに 独自のクエリメソッド を定義できます。

(1) カスタムマネージャの作成

例えば、有効なデータのみを取得するマネージャ を作成する場合、以下のように定義します。

PYTHON
from django.db import models class ActiveManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_active=True)

(2) モデルに適用

このカスタムマネージャをモデルに適用します。

PYTHON
class Item(models.Model): name = models.CharField(max_length=100) is_active = models.BooleanField(default=True) objects = models.Manager() # デフォルトのマネージャ active_objects = ActiveManager() # カスタムマネージャ

ポイント

  • objects全データを取得(デフォルト)
  • active_objectsis_active=True のデータのみ取得

(3) 使い方

PYTHON
all_items = Item.objects.all() # すべてのアイテム active_items = Item.active_objects.all() # is_active=True のアイテムのみ取得

2. カスタムクエリセットの活用

カスタムマネージャに直接フィルタを追加すると、メソッドチェーン(.filter().exclude() など)が使えなくなります。
これを解決するために、カスタムクエリセット(QuerySet) を作成します。

(1) カスタムクエリセットの作成

PYTHON
class ItemQuerySet(models.QuerySet): def active(self): return self.filter(is_active=True) def expensive(self, price): return self.filter(price__gte=price)

(2) モデルマネージャに適用

PYTHON
class 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)

(3) モデルに適用

PYTHON
class 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() # カスタムマネージャ

(4) 使い方

PYTHON
active_items = Item.objects.active() # is_active=True のアイテム expensive_items = Item.objects.expensive(1000) # 1000円以上のアイテム

メリット

  • .filter() を毎回書く必要がなくなる。
  • メソッドチェーンが可能Item.objects.active().expensive(1000) など)。

3. まとめ

  • カスタムマネージャ を作成すると、モデルごとのデータ取得を効率化できる。
  • カスタムクエリセット を活用すると、メソッドチェーンが可能になり、可読性が向上する。
  • objects.get_queryset() をオーバーライドすることで、デフォルトのクエリセットを変更できる。