为什么将管理器声明为Django模型,使“对象”无效

时间:2010-12-15 21:53:30

标签: django django-managers

我已经向以下模型宣布了一位经理,但在这样做之后,我再也无法使用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 个答案:

答案 0 :(得分:19)

Django docs中所述:

  

如果您使用自定义Manager个对象,请注意第一个Manager Django遇到(按照它们在模型中定义的顺序)具有特殊状态。 Django将类中定义的第一个Manager解释为“默认”Manager,Django的几个部分将专门用于该模型Manager。因此,在选择默认管理器时要小心谨慎,以避免覆盖get_query_set()导致无法检索您想要使用的对象。

因此,就“为什么”而言,允许您提供自己的默认管理器。

解决方案很简单:只需添加此

即可
objects = models.Manager()

到您的模型类。

答案 1 :(得分:0)

添加自己的经理会抑制股票经理的创建。

"Manager names"