Менеджеры пользовательских моделей 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
. Дополнительная информация на изменение начального запроса менеджера