Менеджеры пользовательских моделей Django

Я смущен правильным способом использования менеджеров пользовательских моделей Django - на основе документов вы можете создать серию менеджеров для одной модели в качестве способа фильтрации. Но почему бы не создать один класс 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()

и

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

1 ответов


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

men = Person.men.all()

или

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

для второго метода get_query_set является "наследовать" от модели, затем он возвращает набор запросов без настройки. Я не знаю причин отбрасывать ваш второй метод, если вы используете интерфейс администратора, вы должны проверить, что это suported.

кроме того, для второго метода вы должны исправить свой вопрос. Is

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

читать Django manager doc: "Вы можете переопределить базовый набор запросов менеджера, переопределив менеджера.get_query_set() метод. get_query_set () должен возвращать набор запросов с требуемыми свойствами."

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