Django无法找到正确的查询集

时间:2013-03-23 04:21:32

标签: python django

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'对象没有'已发布'属性,

未使用“使用正确的自定义管理器”文本。

什么可能导致此错误?谢谢!

2 个答案:

答案 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课程。