🔖

DjangoでCustom QuerySetを利用して、Railsのscope風クエリ名前付けを実現する

2023/02/04に公開

書くこと

  • Ruby on Railsのscope風、簡易機能をDjangoで書く方法
  • QuerySetのメソッドチェーンで呼び出せる名前付けクエリを定義する方法

利用する技術

  • Django
  • model.QuerySet
  • model.Manager

今日のゴール

このようなArticleモデルが定義されていたとき

class Article(models.Model):
    title = models.CharField(max_length=100)
    # (省略)
    is_active = models.BooleanField(default=True)
    is_exported = models.BooleanField(default=False)

呼び出し側では、以下のようにfilter済みのQuerySetを取得できるようになる。

# 取得条件: 以下を両方満たす集合
# - activeな記事
# - 出力していない記事
export_target = Article.objects.export_target()

方法論

CustomManager/CustomQuerySetを定義

models/manager/article_manager.py

from django.db import models


class ArticleQuerySet(models.QuerySet):
    def export_target(self):
        return self.active().unexported()

    def un_exported(self):
        return self.filter(is_exported=False)

    def active(self):
        return self.filter(is_active=True)


class ArticleManager(models.Manager)
    pass

Articleモデルで利用する

models/article.py

from .managers.article_manager import ArticleManager, ArticleQuerySet


class Article(models.Model):
    # (前略)
    objects = ArticleManager().from_queryset(ArticleQuerySet)

参考文献

Discussion