Менеджеры пользовательских моделей 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
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: "Вы можете переопределить базовый QuerySet менеджера, переопределив метод Manager.get_query_set(). Get_query_set () должен вернуть QuerySet с требуемыми свойствами".
Отредактировано 2017 Будьте осторожны, get_query_set
переименован из djanto 1.7 в get_queryset
, Больше информации в разделе Изменение исходного QuerySet менеджера