2013-06-26 52 views
0

通常我會通過SomeModel.objects()訪問查詢集。Django什麼是管理器中的「對象」

我注意到在模型內部,objects被定義爲某個Manager,比如objects=SomeManager()

所以,如果我在管理器中定義一個方法,我將如何訪問objects

如...

class SomeManager(models.Manager): 
    def some_method(self): 
     (HOW WOULD I ACCESS OBJECTS HERE?) 

class SomeModel(models.Model): 
    ... blah blah 
    objects=SomeManager() 

如果我想的東西過濾,我想我可以做SomeModel.objects.filter經理裏面,但不知何故,感覺怪怪的。它會是什麼像self.filter什麼的?

+1

Inside'Manager'我很肯定你可以做'self.filter',那麼問題是什麼? –

+0

您不應該假設您的管理器綁定到模型的'objects'屬性。 –

回答

1

是的,你只需要使用self.filter,其中'自我'指的是經理本身。該模型的默認管理器是objects,如果您未指定自定義管理器,則會自動創建。因爲你在做一個自定義管理器,所以你不使用objects,因爲顯然這會使用默認的管理器,而不是你自定義的管理器。

所以,從文檔,一個例子是:

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

簡短的回答:你不從自身內部訪問管理器。由於您可以通過self

objects是此案例中的管理員,因此您無需訪問所有方法。由於您通常使用經理來訪問諸如filterget之類的東西,因此您可以在課程中使用self.filterself.get在本地訪問它們。

如果您需要將類似select_related的內容應用於管理器返回的每個查詢集,則可以覆蓋get_queryset方法。