﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
17271	QuerySet.none() doesn't work well with subclasses of QuerySet	Andrey Popp	nobody	"I use `QuerySet` subclassing to allow building complex composable queries out of smaller ones:
{{{
class MyQuerySet(QuerySet):
  def allowed(self, user):
    return self.filter(permissions__in=user.permissions)

  def have_feature(feature_name):
    return self.filter(feature__name=feature_name)
...

objs = Obj.objects.allowed(user).have_feature(""somefeature"")
}}}

Sometimes I want to return `EmptyQuerySet` by calling `none()` to provide ""fast-path"" for some conditions, but unfortunately `EmptyQuerySet` doesn't have my custom methods, so call chain breaks after returning it:

{{{
class MyQuerySet(QuerySet):
  def allowed(self, user):
    if user.is_anonymous:
      return self.none()
    return self.filter(permissions__in=user.permissions)

  def have_feature(feature_name):
    return self.filter(feature__name=feature_name)
...

objs = Obj.objects.allowed(user).have_feature(""some feature"")
# AttributeError: EmptyQuerySet doesn't have have_feature attribute ...
}}}

I've attached a patch which instruments `EmptyQuerySet` subclass for each particular `QuerySet` implementation and returns its instance as a result of `none()` method call. I've also refactored code in `Manager.none()` to reuse existing code in `QuerySet.none()` and to parametrize `Manager()` constructor over `QuerySet` implementation to use."	New feature	closed	Database layer (models, ORM)	dev	Normal	fixed		8mayday@… fizista@…	Accepted	1	0	0	0	1	0
