Author: russellm Date: 2010-04-13 10:18:10 -0500 (Tue, 13 Apr 2010) New Revision: 12970
Modified: django/trunk/django/db/models/query.py django/trunk/tests/regressiontests/queries/tests.py Log: Fixed #13227 -- Ensure that the query cache is flushed when a QuerySet is deepcopied, avoiding problems when an evaluated queryset is used as a subquery. Thanks to claudep for the report. Modified: django/trunk/django/db/models/query.py =================================================================== --- django/trunk/django/db/models/query.py 2010-04-13 10:29:44 UTC (rev 12969) +++ django/trunk/django/db/models/query.py 2010-04-13 15:18:10 UTC (rev 12970) @@ -45,11 +45,12 @@ """ Deep copy of a QuerySet doesn't populate the cache """ - obj_dict = deepcopy(self.__dict__, memo) - obj_dict['_iter'] = None - obj = self.__class__() - obj.__dict__.update(obj_dict) + for k,v in self.__dict__.items(): + if k in ('_iter','_result_cache'): + obj.__dict__[k] = None + else: + obj.__dict__[k] = deepcopy(v, memo) return obj def __getstate__(self): Modified: django/trunk/tests/regressiontests/queries/tests.py =================================================================== --- django/trunk/tests/regressiontests/queries/tests.py 2010-04-13 10:29:44 UTC (rev 12969) +++ django/trunk/tests/regressiontests/queries/tests.py 2010-04-13 15:18:10 UTC (rev 12970) @@ -4,7 +4,7 @@ from django.db.models import Count from django.test import TestCase -from models import Tag, Annotation, DumbCategory +from models import Tag, Annotation, DumbCategory, Note, ExtraInfo class QuerysetOrderedTests(unittest.TestCase): """ @@ -63,3 +63,21 @@ # This prevents us from even evaluating this test case at all. # Refs #10099 self.assertFalse(connections[DEFAULT_DB_ALIAS].features.allow_sliced_subqueries) + +class CloneTests(TestCase): + def test_evaluated_queryset_as_argument(self): + "#13227 -- If a queryset is already evaluated, it can still be used as a query arg" + n = Note(note='Test1', misc='misc') + n.save() + e = ExtraInfo(info='good', note=n) + e.save() + + n_list = Note.objects.all() + # Evaluate the Note queryset, populating the query cache + list(n_list) + # Use the note queryset in a query, and evalute + # that query in a way that involves cloning. + try: + self.assertEquals(ExtraInfo.objects.filter(note__in=n_list)[0].info, 'good') + except: + self.fail('Query should be clonable') -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.