2013-03-23 2 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» не имеет атрибута «опубликовано»,Django не может найти нужный запрос

Текст «использование правого пользовательского менеджера» не был напечатан.

Что может вызвать эту ошибку? Спасибо!

ответ

1

Entry.objects - это менеджер, а не набор запросов. Вы кладете published внутри пользовательского QuerySet, так что вам нужно сделать 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 класс полностью.

Смежные вопросы