[1.8.x] Refs #20625 -- Fixed custom queryset chaining with values() and values_list().

This commit is contained in:
Aric Coady 2015-09-01 13:23:06 -07:00 committed by Tim Graham
parent 4f0966e75f
commit 7d471fe662
3 changed files with 9 additions and 2 deletions

View File

@ -937,10 +937,10 @@ class QuerySet(object):
using=self.db) using=self.db)
def _clone(self, klass=None, setup=False, **kwargs): def _clone(self, klass=None, setup=False, **kwargs):
base_queryset_class = getattr(self, '_base_queryset_class', self.__class__)
if klass is None: if klass is None:
klass = self.__class__ klass = self.__class__
elif not issubclass(self.__class__, klass): elif not (issubclass(base_queryset_class, klass) or issubclass(klass, base_queryset_class)):
base_queryset_class = getattr(self, '_base_queryset_class', self.__class__)
class_bases = (klass, base_queryset_class) class_bases = (klass, base_queryset_class)
class_dict = { class_dict = {
'_base_queryset_class': base_queryset_class, '_base_queryset_class': base_queryset_class,

View File

@ -36,3 +36,6 @@ Bugfixes
* Changed ``Count`` queries to execute ``COUNT(*)`` instead of ``COUNT('*')`` * Changed ``Count`` queries to execute ``COUNT(*)`` instead of ``COUNT('*')``
as versions of Django before 1.8 did (:ticket:`25377`). This may fix a as versions of Django before 1.8 did (:ticket:`25377`). This may fix a
performance regression on some databases. performance regression on some databases.
* Fixed custom queryset chaining with ``values()`` and ``values_list()``
(:ticket:`20625`).

View File

@ -76,6 +76,10 @@ class CustomManagerTests(TestCase):
self.assertEqual(list(queryset), [six.text_type("Bugs")]) self.assertEqual(list(queryset), [six.text_type("Bugs")])
self.assertEqual(queryset._filter_CustomQuerySet, True) self.assertEqual(queryset._filter_CustomQuerySet, True)
self.assertIsInstance(queryset.values(), CustomQuerySet)
self.assertIsInstance(queryset.values().values(), CustomQuerySet)
self.assertIsInstance(queryset.values_list().values(), CustomQuerySet)
def test_init_args(self): def test_init_args(self):
""" """
The custom manager __init__() argument has been set. The custom manager __init__() argument has been set.