読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

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