Я не вижу разницы в подклассе объекта models.manager
и переопределении метода get_query_set
или просто создании нового метода в подклассе class и используя метод. По этой причине я взял пример из книги 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()
С этим я мог бы использовать; 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')