2013-03-23 1 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'속성이 없습니다.장고가 올바른 쿼리 세트를 찾지 못합니다.

'올바른 사용자 정의 관리자 사용'텍스트가 인쇄되지 않았습니다.

이 오류의 원인은 무엇입니까? 고맙습니다!

답변

1

Entry.objects은 쿼리 세트가 아니라 관리자입니다. 당신은 사용자 정의의 검색어 내부 published을 넣어, 그래서 당신은 또한 제대로 published을 구현하지 않는 Entry.objects.all().published() 또는 Entry.objects.get_queryset().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 클래스를 삭제할 수 있습니다.

관련 문제