🔖
DjangoでCustom QuerySetを利用して、Railsのscope風クエリ名前付けを実現する
書くこと
- 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