2017-08-30 65 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方法的特殊情况的示例。