user469652
user469652

Reputation: 51211

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()

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

Answers (2)

Ngenator
Ngenator

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

Christian P.
Christian P.

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

Related Questions