создание подклассов models.Manager

Я не вижу разницы в подклассе объекта 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')
7
задан Sandeep 27 December 2011 в 03:21
поделиться