2013-02-04 10 views
6

公式のDjango documentationの定義を読んだことがありますが、まだManagerとは混同しています。djangoの "マネージャ"とは何ですか?

文書によれば、データベーステーブル/モデルを操作できるようになっています。しかし、私はまだこれを理解していません。

誰かが私にマネージャーとその役割を説明できますか?例の答えが望ましいでしょう。

+0

'あなたがprogrammiに新しいしている場合Managers'は、非常に複雑ジャンゴクラスです:の

books = Book.available_objects.all() 

isnteadあなたはコードに自信が持てるまで、[チュートリアル](https://docs.djangoproject.com/en/dev/intro/tutorial01/)に固執します。 – danodonovan

答えて

5

マネージャは通常、djangoがmodelコードとデータベースバックエンドの間のインターフェースに使用するdjangoプログラマーから隠されたものです。

あなたはDjangoのORMを照会するとき、あなたはので、この場合には

from my_app.models import MyModel 

mms = MyModel.objects.all() 

への呼び出しによって、機能のobjects一部がマネージャによって返されるものですか。あなたがmymodelというを望んでいた場合にのみ、これまで、あなたはマネージャーを作成することができますし、

ので

class BlueManager(models.Manager): 
    def get_query_set(self): 
     return super(BlueManager, self).get_query_set().filter(colour='Blue') 

class MyModel(models.Model): 
    colour = models.CharField(max_length=64) 
    blue_objects = BlueManager() 
をあなたのモデルをハック(データベースがあまりにも redモデルが含まれる可能性があります) blue MyModelインスタンスを取得し、

MyModel.blue_objects.all() 

を呼び出すだけ返しますcolourのオブジェクトはblueです。モデルをフィルタリングするのは非常に貧弱な方法です。

通常はマネージャが返すQuerySetを変更しようとしている場合や、通常のdjangoの「行」レベルではなく「テーブル」レベルのクエリを追加する必要がある場合は、Managerインターフェイスを変更する必要があります。管理者用のdocumentationは完全であり、いくつかの例があります。

+0

クレジットを追加するには、githubのソースコードを読んでください。 https://github.com/django/django/blob/master/django/db/models/manager.py –

3

マネージャは、アプリケーションとデータベースの間にある種の「ゲート」です。良いことの一つは、モデルのための独自のベースクエリーセットを定義できるということです。たとえば:

models.py:

class AvailableBookManager(models.Manager): 
    def get_query_set(self): 
     return super(AvailableBookManager, self).get_query_set().filter(availability=1) 

class Book(models.Model): 
    (...)#fields definition 

    objects = models.Manager() #default manager 
    available_objects = AvailableBookManager() #own manager 

、今あなたが使用することができますが、モデルの可用性」欄で「ブック」を持っている場合、あなたは自分のクエリセット、可用性の種類のフィルタ特定の王を準備することができます

books = Book.objects.filter(available=1)