QuerySetManager - easily add new QuerySet methods using a Model inner class

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.db import models

class QuerySetManager(models.Manager):
    def get_query_set(self):
        return self.model.QuerySet(self.model)

# Using it in a model:

from django.db.models.query import QuerySet
import datetime

class Entry(models.Model):
   ...
   objects = QuerySetManager()
   ...
   class QuerySet(QuerySet):
        def on_date(self, date):
            next = date + datetime.timedelta(days = 1)
            return self.filter(
                posted__gt = date,
                posted__lt = next
            )

# Now you can get entries on a specific day like so:
#   Entry.objects.all().on_date(datetime.date.today())

Comments

dnordberg (on May 6, 2008):

This works for Entry.objects.filter().on_date(date) but not Entry.objects.on_date(date) as some may wish, for this add the following snippet to QuerySetManager.

`

def __getattr__(self, attr, *args):
    try:
        return getattr(self.__class__, attr, *args)
    except AttributeError:
        return getattr(self.get_query_set(), attr, *args)

`

#

exogen (on May 8, 2008):

In response to the above comment, I believe it can simple be written as:

def __getattr__(self, name):
    return getattr(self.get_query_set(), name)

...since the default attribute lookup will check self.class and superclasses.

#

(Forgotten your password?)

You may use Markdown syntax here, but raw HTML will be removed.