我發現在分類models.manager
對象和覆蓋get_query_set
方法或簡單地在子類中創建新方法和使用該方法方面沒有區別。因爲我以Django書爲例,subclassing models.Manager
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()
有了這個我可以使用; Person.women.all()
或Person.men.all()
取出所有的男性或女性模型對象。但是,我想通過簡單的做法就可以實現類似的事情,而不會重寫get_query_set
方法;
class MaleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
class FemaleManager(models.Manager):
def get_female(self):
return return self.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()
現在,用這個,我可以用一點技巧來獲取所有這些對象; Person.objects.get_male()
或Person.objects.get_female()
。但是,在如何獲取對象方面沒有任何細微的差別,但在第一種情況下可讀性和使用方面存在差異,而第二種情況更容易理解並且代碼較少。它們是否在編碼和編碼方面有重大差異模式?另一件事與第二個,如果我把兩個方法放在同一個類裏面,
class PeopleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
def get_female(self):
return return self.filter(sex='F')
如果你只有2種方法,由具有完全獨立的經理提供的組織是不值得的麻煩 - 不知道爲什麼Django的書會建議一個FemaleManager和MaleManager,而不是一個get_females和get_males方法在一個單一的經理。 –
它更依賴於你的抽象層。如果你打算有'人員管理器',它只是按性別區分人的第二選項更有用。如果將來例如'FemaleManager'會有像get_blondes()或get_married()這樣的方法,那麼第二種方法更適合。 –