ジャンゴマネージャ
で、特別なプロパティであるオブジェクトBook.objects.all()文では、データベースを照会することによって必要があります。
要するに、モジュールマネージャは、それを介してオブジェクト、Djangoのデータベースクエリモジュールです。Djangoの各モジュールは、少なくともマネージャを持っている、あなたは、データベースへのアクセスをカスタマイズするためのカスタムマネージャを作成することができます。
カスタムマネージャを作成します:1)追加の管理方法2最初のクエリセットの修理マネージャが返されます)。
1)余分なマネージャのメソッドを追加
追加の管理方法は、モジュールのテーブル・レベルの機能を追加するための好ましい方法です。
例えば、我々は、キーを必要とキーワードの本の数を返しブックtitle_count()メソッドのためのモデルを定義します。(この例は少しこじつけが、それは経営者がどのように機能するかを説明することができます。)
# models.py
from django.db import models
class BookManager(models.Manager):
def title_count(self, keyword):
return self.filter(title__icontains=keyword).count()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
num_pages = models.IntegerField(blank=True, null=True)
objects = BookManager() # 语法就是object=SomeManager
def __unicode__(self):
return self.title
このマネージャで、我々は今、これを行うことができます:
>>> Book.objects.title_count('django')
4
>>> Book.objects.title_count('python')
18
なぜ我々はtitle_countを追加したい()メソッドが行うのですか?クエリが頻繁にカプセル化するために使用されているので、我々はエンコード繰り返さないでください。
初期マネージャのクエリセットを変更します。
実質的クエリセットマネージャは、システム内のすべてのオブジェクトを返します。例えば、Book.objects.all()
本のデータベースにすべての書籍を返します。
我々は、ベースクエリセットマネージャをオーバーライドするManager.get_query_set()メソッドをカバーすることができます。get_query_setは()あなたの要求とクエリセットに従ってを返します。
この例は、別の興味深い技術を指摘した:同じモデルに複数のマネージャーを使用して。あなたが好きなら、あなたはあなたのモデルのために複数の管理者()の例を追加することができます。これは、モデルのための一般的なフィルタを追加する簡単な方法です。
例えば:
class MaleManager(models.Manager):
def get_query_set(self):
return super(MaleManager, self).get_query_set().filter(sex='M')
class FemaleManager(models.Manager):
def get_query_set(self):
return super(FemaleManager, self).get_query_set().filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()
この例では、実行することを可能にするPerson.men.all()
、Person.women.all()
、Person.people.all()
あなたが望む結果を、クエリを生成します。
カスタムManagerオブジェクトを使用する場合は、特別な地位を持っている(勝つモデルで定義された位置に)、Djangoの最初の遭遇マネージャーに注意してください。Djangoは間違いなくモデルマネージャーとしてこれを使用するデフォルトのマネージャーとして定義された最初のマネージャー、(adminアプリケーションを含むがない)多くのジャンゴの部分になります。結論は、あなたのデフォルトのマネージャーを選択するように注意しなければならないということです。カバレッジget_query_set()は、あなたに無用の返還を受けることができるので、あなたはこれを避けるために持っています。