Skip to content

Instantly share code, notes, and snippets.

@loic
Created September 19, 2014 19:01
Show Gist options
  • Save loic/b928c00aa907bc66c23b to your computer and use it in GitHub Desktop.
Save loic/b928c00aa907bc66c23b to your computer and use it in GitHub Desktop.
diff --git a/django/db/models/manager.py b/django/db/models/manager.py
index 5510b7d..8b11699 100644
--- a/django/db/models/manager.py
+++ b/django/db/models/manager.py
@@ -174,7 +174,7 @@ class BaseManager(object):
Returns a new QuerySet object. Subclasses can override this method to
easily customize the behavior of the Manager.
"""
- return self._queryset_class(self.model, using=self._db, hints=self._hints)
+ return self._queryset_class(self.model, using=self._db, hints=self._hints).get_initial_queryset()
def all(self):
# We can't proxy this method through the `QuerySet` like we do for the
diff --git a/django/db/models/query.py b/django/db/models/query.py
index be5892a..d5d4243 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -63,7 +63,17 @@ class QuerySet(object):
self._prefetch_done = False
self._known_related_objects = {} # {rel_field, {pk: rel_obj}}
+ def get_initial_queryset(self):
+ """
+ Hook to provide a default state for custom QuerySet.
+ """
+ return self
+ get_initial_queryset.queryset_only = True
+
def as_manager(cls):
+ """
+ Create and instantiate a Manager from this QuerySet.
+ """
# Address the circular dependency between `Queryset` and `Manager`.
from django.db.models.manager import Manager
return Manager.from_queryset(cls)()
diff --git a/tests/custom_managers/models.py b/tests/custom_managers/models.py
index bbf037b..2d87c83 100644
--- a/tests/custom_managers/models.py
+++ b/tests/custom_managers/models.py
@@ -71,14 +71,14 @@ class BaseCustomManager(models.Manager):
CustomManager = BaseCustomManager.from_queryset(CustomQuerySet)
-class FunPeopleManager(models.Manager):
- def get_queryset(self):
- return super(FunPeopleManager, self).get_queryset().filter(fun=True)
+class FunPeopleQueryset(models.QuerySet):
+ def get_initial_queryset(self):
+ return self.filter(fun=True)
-class BoringPeopleManager(models.Manager):
- def get_queryset(self):
- return super(BoringPeopleManager, self).get_queryset().filter(fun=False)
+class BoringPeopleQueryset(models.QuerySet):
+ def get_initial_queryset(self):
+ return self.filter(fun=False)
@python_2_unicode_compatible
@@ -93,8 +93,8 @@ class Person(models.Model):
favorite_thing = GenericForeignKey('favorite_thing_type', 'favorite_thing_id')
objects = PersonManager()
- fun_people = FunPeopleManager()
- boring_people = BoringPeopleManager()
+ fun_people = FunPeopleQueryset.as_manager()
+ boring_people = BoringPeopleQueryset.as_manager()
custom_queryset_default_manager = CustomQuerySet.as_manager()
custom_queryset_custom_manager = CustomManager('hello')
@@ -114,7 +114,7 @@ class FunPerson(models.Model):
favorite_thing_id = models.IntegerField(null=True)
favorite_thing = GenericForeignKey('favorite_thing_type', 'favorite_thing_id')
- objects = FunPeopleManager()
+ objects = FunPeopleQueryset.as_manager()
def __str__(self):
return "%s %s" % (self.first_name, self.last_name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment