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

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

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

4

2 回答 2

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')
于 2013-03-23T04:43:26.487 回答
0

您的方法published()应该在 EntryManager 类上,不需要创建新的 QuerySet 类(通常只有当您想更深入地研究如何从数据库中获取数据时)。

正确的解决方案是:

class EntryManger(models.Manager):
    def published(self):
        print 'using right custom manager'
        return self.filter(self.status == 'published')

您可以完全删除该EntryQuerySet课程。

于 2013-03-23T04:29:37.367 回答