2011-11-13 186 views
12

我对使用Django自定义模型管理器的正确方式感到困惑 - 基于文档,您可以为一个模型创建一系列管理器作为过滤的一种方式。但为什么不创建一个具有一系列过滤功能的经理类?一种方法比另一种更好吗?为什么?Django自定义模型管理器

例如:

class MaleManager(models.Manager): 
    def get_query_set(self): 
     return super(MaleManager, self).get_query_set().filter(sex='M') 

class FemaleManager(models.Manager): 
    def get_query_set(self): 
     return super(FemaleManager, self).get_query_set().filter(sex='F') 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female'))) 
    people = models.Manager() 
    men = MaleManager() 
    women = FemaleManager() 

class PersonManager(models.Manager): 
    def males(self): 
     return super(MaleManager, self).get_query_set().filter(sex='M') 

    def females(self): 
     return super(FemaleManager, self).get_query_set().filter(sex='F') 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female'))) 
    people = PersonManager() 

Person.people.females() # to get list of females 
Person.people.males() # to get a list of males 

回答

12

随着第一种方法可以编写:

men = Person.men.all() 

peters_men = Person.men.filter(first_name='Peter') 

对于第二种方法get_query_set是从模型'继承',那么它将返回查询集而不进行自定义。我不知道有什么理由放弃你的第二种方法,如果你使用管理界面,你应该检查这是否支持。

此外,对于第二种方法,你应该改正你的问题。是

class PersonManager(models.Manager): 
    def males(self): 
     return super(PersonManager, self).get_query_set().filter(sex='M') 

Read django manager doc:“你可以通过覆盖Manager.get_query_set()方法来覆盖一个经理的基本查询集get_query_set()应该返回一个QuerySet与您所需要的性能。”

编辑2017请注意,get_query_set从djanto 1.7更名为get_queryset。更多信息在Modifying a manager’s initial QuerySet

+1

是的,但两种方法正在返回querysets ...所以不会Person.objects.females.filter(first_name ='简')仍然工作? ... –

+1

@ 9位:不要忘了实际调用该方法。 –

+0

@ IgnacioVazquez-Abrams你是什么意思? Person.people.females.filter(first_name ='Jane')不会调用方法然后过滤吗? –

相关问题