Reputation: 51211
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()
When I do Entry.objects.published()
, the error raises. It complains that
'EntryManger' object has no attribute 'published',
The text of 'using right custom manager' wasn't printed.
What could cause this error? Thank you!
Upvotes: 0
Views: 137
Reputation: 11259
Entry.objects
is a manager, not a queryset. You put published
inside your custom queryset, so you need to do Entry.objects.all().published()
or Entry.objects.get_queryset().published()
You also aren't implementing published
correctly. It should be more like:
class EntryQueryset(QuerySet):
def published(self):
return self.filter(status='published')
Upvotes: 1
Reputation: 4884
Your method published()
should be on the EntryManager class, there is no need to create a new QuerySet class (generally that is only when you want to dig deeper into how data is fetched from the database).
The correct solution would be:
class EntryManger(models.Manager):
def published(self):
print 'using right custom manager'
return self.filter(self.status == 'published')
You can delete the EntryQuerySet
class entirely.
Upvotes: 0