mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #9985 -- qs.values_list(...).values(...) was constructing incorrect SQL.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9717 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -680,6 +680,7 @@ class ValuesQuerySet(QuerySet): | |||||||
|         Called by the _clone() method after initializing the rest of the |         Called by the _clone() method after initializing the rest of the | ||||||
|         instance. |         instance. | ||||||
|         """ |         """ | ||||||
|  |         self.query.clear_select_fields() | ||||||
|         self.extra_names = [] |         self.extra_names = [] | ||||||
|         if self._fields: |         if self._fields: | ||||||
|             if not self.query.extra_select: |             if not self.query.extra_select: | ||||||
| @@ -704,7 +705,10 @@ class ValuesQuerySet(QuerySet): | |||||||
|         Cloning a ValuesQuerySet preserves the current fields. |         Cloning a ValuesQuerySet preserves the current fields. | ||||||
|         """ |         """ | ||||||
|         c = super(ValuesQuerySet, self)._clone(klass, **kwargs) |         c = super(ValuesQuerySet, self)._clone(klass, **kwargs) | ||||||
|         c._fields = self._fields[:] |         if not hasattr(c, '_fields'): | ||||||
|  |             # Only clone self._fields if _fields wasn't passed into the cloning | ||||||
|  |             # call directly. | ||||||
|  |             c._fields = self._fields[:] | ||||||
|         c.field_names = self.field_names |         c.field_names = self.field_names | ||||||
|         c.extra_names = self.extra_names |         c.extra_names = self.extra_names | ||||||
|         if setup and hasattr(c, '_setup_query'): |         if setup and hasattr(c, '_setup_query'): | ||||||
|   | |||||||
| @@ -1538,6 +1538,15 @@ class BaseQuery(object): | |||||||
|         """ |         """ | ||||||
|         return not (self.low_mark or self.high_mark) |         return not (self.low_mark or self.high_mark) | ||||||
|  |  | ||||||
|  |     def clear_select_fields(self): | ||||||
|  |         """ | ||||||
|  |         Clears the list of fields to select (but not extra_select columns). | ||||||
|  |         Some queryset types completely replace any existing list of select | ||||||
|  |         columns. | ||||||
|  |         """ | ||||||
|  |         self.select = [] | ||||||
|  |         self.select_fields = [] | ||||||
|  |  | ||||||
|     def add_fields(self, field_names, allow_m2m=True): |     def add_fields(self, field_names, allow_m2m=True): | ||||||
|         """ |         """ | ||||||
|         Adds the given (model) fields to the select set. The field names are |         Adds the given (model) fields to the select set. The field names are | ||||||
|   | |||||||
| @@ -1022,6 +1022,12 @@ nothing). | |||||||
| >>> print Annotation.objects.filter(notes__in=Note.objects.filter(note="xyzzy")).query | >>> print Annotation.objects.filter(notes__in=Note.objects.filter(note="xyzzy")).query | ||||||
| SELECT ... | SELECT ... | ||||||
|  |  | ||||||
|  | Bug #9985 -- qs.values_list(...).values(...) combinations should work. | ||||||
|  | >>> Note.objects.values_list("note", flat=True).values("id").order_by("id") | ||||||
|  | [{'id': 1}, {'id': 2}, {'id': 3}] | ||||||
|  | >>> Annotation.objects.filter(notes__in=Note.objects.filter(note="n1").values_list('note').values('id')) | ||||||
|  | [<Annotation: a1>] | ||||||
|  |  | ||||||
| """} | """} | ||||||
|  |  | ||||||
| # In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__ | # In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user