2013-03-23 51 views
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'對象沒有屬性'published',Django無法找到正確的查詢集

'使用正確的自定義管理器'的文本沒有打印。

什麼可能導致此錯誤?謝謝!

回答

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') 
0

你的方法published()應該在EntryManager類上,不需要創建一個新的QuerySet類(通常只有當你想深入瞭解如何從數據庫中獲取數據時)。

正確的解決辦法是:

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

您可以完全刪除EntryQuerySet類。