class TimeStampedModel(models.Model):
created = DateTimeField(_('created'), auto_now=False, auto_now_add=True)
modified = DateTimeField(_('modified'), auto_now=True, auto_now_add=False)
class Meta:
abstract = True
class TimeFramedModel(models.Model):
start = models.DateTimeField(_('start'), null=True, blank=True)
end = models.DateTimeField(_('end'), null=True, blank=True)
class Meta:
abstract = True
class EntryQueryset(QuerySet):
def published(self):
return self.filter(self.status == 'published')
class EntryManger(models.Manager):
def get_query_set(self):
print 'using right custom manager'
return EntryQueryset(self.model, using=self._db)
class Entry(TimeStampedModel, TimeFramedModel):
status = models.CharField(
_('status'), choices=STATUS_CHOICES, max_length=16,
default='draft')
objects = EntryManger()
当我Entry.objects.published()
时,错误会增加。它抱怨说
'EntryManger'对象没有'已发布'属性,
未使用“使用正确的自定义管理器”文本。
什么可能导致此错误?谢谢!
答案 0 :(得分:1)
Entry.objects
是一个经理,而不是一个查询集。您将published
放入自定义查询集中,因此您需要执行Entry.objects.all().published()
或Entry.objects.get_queryset().published()
您也没有正确实施published
。它应该更像是:
class EntryQueryset(QuerySet):
def published(self):
return self.filter(status='published')
答案 1 :(得分:0)
您的方法published()
应该在EntryManager类上,不需要创建新的QuerySet类(通常只有当您想深入了解如何从数据库中提取数据时)。
正确的解决方案是:
class EntryManger(models.Manager):
def published(self):
print 'using right custom manager'
return self.filter(self.status == 'published')
您可以完全删除EntryQuerySet
课程。