Author: russellm
Date: 2009-04-11 08:20:51 -0500 (Sat, 11 Apr 2009)
New Revision: 10522

Modified:
   django/trunk/django/db/models/sql/query.py
   django/trunk/tests/regressiontests/aggregation_regress/models.py
Log:
Fixed #10197 -- Corrected pickling of querysets when a subset of fields was 
selected.

Modified: django/trunk/django/db/models/sql/query.py
===================================================================
--- django/trunk/django/db/models/sql/query.py  2009-04-11 12:09:34 UTC (rev 
10521)
+++ django/trunk/django/db/models/sql/query.py  2009-04-11 13:20:51 UTC (rev 
10522)
@@ -123,12 +123,18 @@
         obj_dict['related_select_fields'] = []
         obj_dict['related_select_cols'] = []
         del obj_dict['connection']
+
+        # Fields can't be pickled, so we pickle the list of field names 
instead.
+        obj_dict['select_fields'] = [f.name for f in obj_dict['select_fields']]
         return obj_dict
 
     def __setstate__(self, obj_dict):
         """
         Unpickling support.
         """
+        # Rebuild list of field instances
+        obj_dict['select_fields'] = [obj_dict['model']._meta.get_field(name) 
for name in obj_dict['select_fields']]
+
         self.__dict__.update(obj_dict)
         # XXX: Need a better solution for this when multi-db stuff is
         # supported. It's the only class-reference to the module-level

Modified: django/trunk/tests/regressiontests/aggregation_regress/models.py
===================================================================
--- django/trunk/tests/regressiontests/aggregation_regress/models.py    
2009-04-11 12:09:34 UTC (rev 10521)
+++ django/trunk/tests/regressiontests/aggregation_regress/models.py    
2009-04-11 13:20:51 UTC (rev 10522)
@@ -1,4 +1,6 @@
 # coding: utf-8
+import pickle
+
 from django.db import models
 from django.conf import settings
 
@@ -242,6 +244,19 @@
 >>> Book.objects.filter(id__in=ids)
 [<Book: Python Web Development with Django>]
 
+# Regression for #10197 -- Queries with aggregates can be pickled.
+# First check that pickling is possible at all. No crash = success
+>>> qs = Book.objects.annotate(num_authors=Count('authors'))
+>>> out = pickle.dumps(qs)
+
+# Then check that the round trip works.
+>>> query = qs.query.as_sql()[0]
+>>> select_fields = qs.query.select_fields
+>>> query2 = pickle.loads(pickle.dumps(qs))
+>>> query2.query.as_sql()[0] == query
+True
+>>> query2.query.select_fields = select_fields
+
 # Regression for #10199 - Aggregate calls clone the original query so the 
original query can still be used
 >>> books = Book.objects.all()
 >>> _ = books.aggregate(Avg('authors__age'))


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@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