[英]Django can't find the right queryset
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”對象沒有“發布”屬性,
沒有使用“使用正確的自定義經理”的文本。
是什么導致此錯誤? 謝謝!
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
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.