Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #10197 -- Corrected pickling of querysets when a subset of fiel…

…ds was selected.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10522 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit e12e0e18a4a666c22e119990a495c76079110934 1 parent 0fff47c
Russell Keith-Magee freakboy3742 authored
6 django/db/models/sql/query.py
View
@@ -123,12 +123,18 @@ def __getstate__(self):
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
15 tests/regressiontests/aggregation_regress/models.py
View
@@ -1,4 +1,6 @@
# coding: utf-8
+import pickle
+
from django.db import models
from django.conf import settings
@@ -242,6 +244,19 @@ def __unicode__(self):
>>> 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'))
Please sign in to comment.
Something went wrong with that request. Please try again.