Django找不到合适的查询

2024-10-02 14:27:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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”对象没有“published”属性

没有打印“使用正确的自定义管理器”的文本。你知道吗

什么会导致这个错误?谢谢您!你知道吗


Tags: selfaddfalsetrueautomodelmodelsstatus
2条回答

Entry.objects是管理器,而不是查询集。您将published放入自定义查询集中,因此需要执行Entry.objects.all().published()Entry.objects.get_queryset().published()

您也没有正确地实现published。它应该更像:

class EntryQueryset(QuerySet):

    def published(self):
        return self.filter(status='published')

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

正确的解决方案是:

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

您可以完全删除EntryQuerySet类。你知道吗

相关问题 更多 >