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.

Reply via email to