Подтвердить что ты не робот

Менеджеры пользовательских моделей 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
4b9b3361

Ответ 1

С помощью первого метода вы можете написать:

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')

Прочитайте django doc: "Вы можете переопределить базовый QuerySet-менеджер, переопределив метод Manager.get_query_set(). get_query_set() должен верните QuerySet с требуемыми свойствами."

Отредактировано 2017 Будьте осторожны, get_query_set переименовывается из djanto 1.7 в get_queryset. Дополнительная информация на Изменение начального QuerySet менеджеров