2013-02-04 62 views
6

我已閱讀官方Django documentation中的定義,我仍然對Manager做了什麼感到困惑。django中的「經理」是什麼?

該文件說明它們允許您在數據庫表格/模型上操作。但我仍然不明白這一點。

有人可以向我解釋經理及其角色嗎?舉一個例子的答案會更好。

+0

'Managers'是一個相當複雜的Django類,如果你是新來programmi恩,我會堅持[教程](https://docs.djangoproject.com/en/dev/intro/tutorial01/),直到你對代碼更有信心。 – danodonovan

回答

5

一個管理員通常隱藏在django程序員身上,django用它來連接model代碼和數據庫後端。

當查詢Django的ORM,你通過調用這樣做

from my_app.models import MyModel 

mms = MyModel.objects.all() 

在這種情況下,該功能的objects部分就是由經理返回。如果你想爲MyModel只能永遠得到blueMyModel實例(數據庫可能包含red型號太多),那麼你可以創建一個管理員和黑客模型因此

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() 

,並呼籲

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.available_objects.all() 

的isntead:

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