Skip to content

Instantly share code, notes, and snippets.

@ojii
Created November 3, 2011 10:59
Show Gist options
  • Save ojii/1336255 to your computer and use it in GitHub Desktop.
Save ojii/1336255 to your computer and use it in GitHub Desktop.
Django Model Managers
# -*- coding: utf-8 -*-
from django.db import models
from django.db.models.query import QuerySet
class ChainableManager(models.Manager):
"""
A manager that allows chaining of all methods defined on it.
Example:
class MyManager(ChainableManager):
def active(self):
return self.filter(active=True)
def premium(self):
return self.filter(premium=True)
class MyModel(models.Model):
active = models.BooleanField()
premium = models.BooleanField()
objects = MyManager()
active_premium = MyModel.objects.active().premium()
"""
def get_query_set(self):
queryset_class = type('ChainedQuerySet', (QuerySet, self.__class__,), {})
return queryset_class(self.model, using=self._db)
class SelectRelatedManager(models.Manager):
"""
A manager that automatically selects related on any query.
Example:
class Account(models.Model):
user = models.ForeignKey('auth.User', unique=True)
objects = SelectRelatedManager('user')
account = Account.objects.get(pk=1) # 1 query
account.user.username # 0 queries
"""
def __init__(self, *select_related):
self._select_related = select_related
super(SelectRelatedManager, self).__init__()
def get_query_set(self, *args, **kwargs):
queryset = super(SelectRelatedManager, self).get_query_set(*args, **kwargs)
return queryset.select_related(*self._select_related)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment