katylava
7/3/2012 - 1:24 PM

Django Model Managers

Django Model Managers

from django.db import models

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)
from django.db import models

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)