From c624d7a301a6644f6faf33eb88000582855abe1f Mon Sep 17 00:00:00 2001 From: Paul McLanahan Date: Tue, 8 Mar 2011 13:52:32 -0500 Subject: [PATCH] Added PassThroughManager to managers. Added me to authors. --- AUTHORS.rst | 1 + model_utils/managers.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index a5da196..ae3eecf 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -2,3 +2,4 @@ Carl Meyer Jannis Leidel Gregor Müllegger Jeff Elmore +Paul McLanahan diff --git a/model_utils/managers.py b/model_utils/managers.py index 7b764dd..47e7fbb 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -81,6 +81,42 @@ class QueryManager(models.Manager): return qs +class PassThroughManager(models.Manager): + ''' + Inherit from this Manager to enable you to call any methods from your + custom QuerySet class from your manager. Simply define your QuerySet + class, and return an instance of it from your manager's `get_query_set` + method. + + Alternately, if you don't need any extra methods on your manager that + aren't on your QuerySet, then just pass your QuerySet class to this + class' constructer. + + class PostQuerySet(QuerySet): + def enabled(self): + return self.filter(disabled=False) + + class Post(models.Model): + objects = PassThroughManager(PostQuerySet) + ''' + # pickling causes recursion errors + _deny_methods = ['__getstate__', '__setstate__'] + + def __init__(self, queryset_cls=None): + self._queryset_cls = queryset_cls + super(PassthroughManager, self).__init__() + + def __getattr__(self, name): + if name in self._deny_methods: + raise AttributeError(name) + return getattr(self.get_query_set(), name) + + def get_query_set(self): + if self._queryset_cls is not None: + return self._queryset_cls(self.model, using=self._db) + return super(PassThroughManager, self).get_query_set() + + def manager_from(*mixins, **kwds): ''' Returns a Manager instance with extra methods, also available and