Django e-commerce part13 Model Managers
models.Mangerを使った、model classの作成
activeなリストのみを表示したい。
products/models.py を以下のように設定する。
class ProductQuerySet(models.query.QuerySet): def active(self): return self.filter(active=True) class ProductManager(models.Manager): def get_queryset(self): return ProductQuerySet(self.model, using=self._db) def all(self, *args, **kwargs): return self.get_queryset().active() class Product(models.Model): ... objects = ProductManager() ...
ProductQuerySet は、QuerySetのmodelを継承しているclassで、def activeは、self.filter(active=True)という値を返すように、filterとかをかけるためのclass
ProductManagerは、Managerclassを継承しており、get_querysetで、ProductQuerySetのclassをゲットしており、active() でactiveのみのfilterをかけている。
objects = ProductManager() で、objectsを上書きしている。(通常だと、objectsは、すべてのinstanceを表示)
なぜこんな周りくどいやり方をするのかがよくわからない。Productの関数とかで設定はできないのか。 viewではなく、modelで、filterとかをかけるために、このようなことをしているのかもしれない。
試しに、views.py のlistviewで、以下のコードを入れてみる。
class ProductListView(ListView): model = Product queryset = Product.objects.filter(active=False)
そうすると、querysetが、上書きされて、active=Falseのリスト一覧が表示される。
- 役割としては、 ProductQuerySetが、querysetの抽出条件の関数を設定する ProductManagerが、その抽出条件をもとにしたquerysetをゲットする。 Productが、そのquerysetをobjectsに代入する。
さっぱりわからんw