2017-08-30 64 views
1

我讀的Django docs和這兩個類看起來相似,Django的模型管理器或Django的查詢集

這裏是Django文檔樣本:

class PersonQuerySet(models.QuerySet): 
    def authors(self): 
     return self.filter(role='A') 

    def editors(self): 
     return self.filter(role='E') 

class PersonManager(models.Manager): 
    def get_queryset(self): 
     return PersonQuerySet(self.model, using=self._db) 

    def authors(self): 
     return self.get_queryset().authors() 

    def editors(self): 
     return self.get_queryset().editors() 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    role = models.CharField(max_length=1, choices=(('A', _('Author')), ('E', _('Editor')))) 
    people = PersonManager() 

在示例代碼中,你可以看到代碼PersonQuerySet可以移動到PersonManager(或移動管理器查詢設置) - 我的觀點是我可以合併一個到另一個沒有任何問題)

所以管理器和queryset有什麼區別?他們有不同的用例嗎?或者我應該簡單地使用其中一個而忽略另一個的存在?

回答

1

這有點怪癖。基本上,如果你想在你的QuerySet 中編寫自定義方法,你希望能夠通過Manager類訪問它們,你可以在Manager類中使用實現它們。這看起來不太好,因爲它對於Django來說並不是非常乾燥,它儘可能地儘可能幹,因此幫助者as_manager()。

因此,要回答您的問題,這些不是兩種不同的情況,而是您希望通過自定義管理器使用自定義QuerySet方法的特殊情況的示例。