mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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:
		| @@ -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')) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user