Почему объявление менеджера модели Django, пустые "объекты" - PullRequest
5 голосов
/ 16 декабря 2010

Я объявил менеджера для следующей модели, но после этого я больше не могу использовать List.objects.get().Кто-нибудь знает почему?

class List(models.Model):
  title = models.CharField(max_length=20, unique=True)
  archived = models.BooleanField()

  archived_lists = ArchivedListManager()
  active_lists = ActiveListManager()

А менеджеры:

class ArchivedListManager(models.Manager):
  def get_query_set(self):
    return super(ArchivedListManager, self).get_query_set().filter(archived=True)

class ActiveListManager(models.Manager):
  def get_query_set(self):
    return super(ActiveListManager, self).get_query_set().filter(archived=False)

Ошибка type object 'List' has no attribute 'objects'

Ответы [ 2 ]

19 голосов
/ 16 декабря 2010

Как отмечено в Django документах :

Если вы используете пользовательские Manager объекты, обратите внимание, что первые Manager Django встречаются (в порядке, в которомони определены в модели) имеет особый статус.Django интерпретирует первый Manager, определенный в классе, как «по умолчанию» Manager, и несколько частей Django будут использовать этот Manager исключительно для этой модели.В связи с этим рекомендуется соблюдать осторожность при выборе менеджера по умолчанию, чтобы избежать ситуации, когда переопределение get_query_set() приводит к невозможности получения объектов, с которыми вы хотели бы работать.

Итак, что касается «почему», это позволяет вам предоставить свой собственный менеджер по умолчанию.

Решение простое, однако: просто добавьте это

objects = models.Manager()

в вашу моделькласс.

0 голосов
/ 16 декабря 2010

Добавление собственного менеджера подавляет создание менеджера акций.

«Имена менеджеров»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...