2011-07-26 72 views
1

所以,我已經閱讀了大部分的文檔,並且我一直在環視這個問題,但是我無法完全找到我的問題的答案。我將從代碼開始。Django Managers的順序會影響哪些功能?

# Manager 
class ActiveManager(models.Manager): 
    def get_query_set(self): 
     return super(ActiveManager, self).get_query_set().filter(is_active=True) 
# Model 
class ModelA(models.Model): 
    # ... 
    is_active = models.BooleanField() 
    objects = ActiveManager() 
    all_objects = models.Manager() 

所以,我打轉轉,而我注意到,如果我寫的這種方式和使用get_object_or_404(),那麼它將使用ActiveManager先搜索所有活動記錄,然後返回一個有關我的查詢。但是,如果我換了經理的順序:

class ModelA(models.Model): 
    # ... 
    all_objects = models.Manager() 
    objects = ActiveManager() 

然後,它使用默認的經理,在這種情況下all_objects,做查詢。我想知道這種變化會對其他功能產生什麼影響。

編輯:據我所知,第一個經理髮現,在類成爲默認的經理,但我不知道具體的功能使用默認的管理器,它(如get_object_or_404

回答

2
+0

是啊,我讀了,但我不知道它具體的東西會用_default_manager這樣我就可以看出來他們。最常見的可能足夠好 –

+0

@Bryce Siedschlaw,我發現Django引用模型的'objects'屬性的代碼中的唯一位置(即,動態傳遞的 - 當然他們使用'User .objects','Site.objects'等)是[here](https://code.djangoproject.com/browser/django/trunk/django/views/generic/create_update.py#L78)(但是基於函數的通用視圖反正也被棄用)。特別是,通用視圖默認使用'_default_manager'。 –

+0

你不會偶然知道任何使用_default_manager的特定常用函數嗎?像'get_object_or_404'一樣。 –

0

它影響很多事情。經理objects的默認名稱就是默認名稱,但不是必需的。如果您在模型定義中沒有包含objects,並且只將經理定義爲all_objects,則ModelA.objects不存在。如果模型中沒有其他經理出現,Django只會爲其分配一個默認經理,而您自己並沒有定義objects

不管怎麼說,因爲這個Django需要在模型中定義第一個管理器並調用「default」,並隨後使用「default」管理器需要引用模型的管理器(因爲它可以' t只需使用objects,因爲objects可能未定義)。

經驗法則是,Django應該使用的標準管理器(從某種意義上講,應該是最常用的管理器)應該是第一個定義的,無論它是完全分配給objects還是別的。在此之後,其他所有經理都應該出現。

+0

就像我告訴isbadawi,我已經閱讀了文檔的這些部分,並理解了所有這些。我只是想知道哪些特定的函數使用模型的默認管理器(如'get_object_or_404')。這樣我可以追蹤他們,並確保他們正在做我想做的事。這是我沒有在問題中指定的錯。 –

+0

我認爲我們都在做的一點是它是一切。 Django從不直接調用'objects'。因此,任何執行查找的方法都將使用默認管理器,無論如何。 –

相關問題