Fixed #10197 -- Corrected pickling of querysets when a subset of fields was selected.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10522 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
0fff47c90f
commit
e12e0e18a4
|
@ -123,12 +123,18 @@ class BaseQuery(object):
|
||||||
obj_dict['related_select_fields'] = []
|
obj_dict['related_select_fields'] = []
|
||||||
obj_dict['related_select_cols'] = []
|
obj_dict['related_select_cols'] = []
|
||||||
del obj_dict['connection']
|
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
|
return obj_dict
|
||||||
|
|
||||||
def __setstate__(self, obj_dict):
|
def __setstate__(self, obj_dict):
|
||||||
"""
|
"""
|
||||||
Unpickling support.
|
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)
|
self.__dict__.update(obj_dict)
|
||||||
# XXX: Need a better solution for this when multi-db stuff is
|
# XXX: Need a better solution for this when multi-db stuff is
|
||||||
# supported. It's the only class-reference to the module-level
|
# supported. It's the only class-reference to the module-level
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
import pickle
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
@ -242,6 +244,19 @@ FieldError: Cannot resolve keyword 'foo' into field. Choices are: authors, conta
|
||||||
>>> Book.objects.filter(id__in=ids)
|
>>> Book.objects.filter(id__in=ids)
|
||||||
[<Book: Python Web Development with Django>]
|
[<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
|
# Regression for #10199 - Aggregate calls clone the original query so the original query can still be used
|
||||||
>>> books = Book.objects.all()
|
>>> books = Book.objects.all()
|
||||||
>>> _ = books.aggregate(Avg('authors__age'))
|
>>> _ = books.aggregate(Avg('authors__age'))
|
||||||
|
|
Loading…
Reference in New Issue