mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.6.x] Fixed #21203 -- resolve_columns fields misalignment
In queries using .defer() together with .select_related() the values
and fields arguments didn't align properly for resolve_columns().
Backpatch of bf13c75c0d from master.
			
			
This commit is contained in:
		| @@ -736,9 +736,8 @@ class SQLCompiler(object): | ||||
|                         # into `resolve_columns` because it wasn't selected. | ||||
|                         only_load = self.deferred_to_columns() | ||||
|                         if only_load: | ||||
|                             db_table = self.query.get_meta().db_table | ||||
|                             fields = [f for f in fields if db_table in only_load and | ||||
|                                       f.column in only_load[db_table]] | ||||
|                             fields = [f for f in fields if f.model._meta.db_table not in only_load or | ||||
|                                       f.column in only_load[f.model._meta.db_table]] | ||||
|                         if has_aggregate_select: | ||||
|                             # pad None in to fields for aggregates | ||||
|                             fields = fields[:aggregate_start] + [ | ||||
|   | ||||
| @@ -527,3 +527,12 @@ class StaffUser(BaseUser): | ||||
|  | ||||
|     def __str__(self): | ||||
|         return self.staff | ||||
|  | ||||
| class Ticket21203Parent(models.Model): | ||||
|     parentid = models.AutoField(primary_key=True) | ||||
|     parent_bool = models.BooleanField(default=True) | ||||
|     created = models.DateTimeField(auto_now=True) | ||||
|  | ||||
| class Ticket21203Child(models.Model): | ||||
|     childid = models.AutoField(primary_key=True) | ||||
|     parent = models.ForeignKey(Ticket21203Parent) | ||||
|   | ||||
| @@ -26,8 +26,8 @@ from .models import ( | ||||
|     OneToOneCategory, NullableName, ProxyCategory, SingleObject, RelatedObject, | ||||
|     ModelA, ModelB, ModelC, ModelD, Responsibility, Job, JobResponsibilities, | ||||
|     BaseA, FK1, Identifier, Program, Channel, Page, Paragraph, Chapter, Book, | ||||
|     MyObject, Order, OrderItem, Task, Staff, StaffUser) | ||||
|  | ||||
|     MyObject, Order, OrderItem, Task, Staff, StaffUser, Ticket21203Parent, | ||||
|     Ticket21203Child) | ||||
|  | ||||
| class BaseQuerysetTest(TestCase): | ||||
|     def assertValueQuerysetEqual(self, qs, values): | ||||
| @@ -3000,3 +3000,11 @@ class Ticket20955Tests(TestCase): | ||||
|                              task_get.creator.staffuser.staff) | ||||
|             self.assertEqual(task_select_related.owner.staffuser.staff, | ||||
|                              task_get.owner.staffuser.staff) | ||||
|  | ||||
| class Ticket21203Tests(TestCase): | ||||
|     def test_ticket_21203(self): | ||||
|         p = Ticket21203Parent.objects.create(parent_bool=True) | ||||
|         c = Ticket21203Child.objects.create(parent=p) | ||||
|         qs = Ticket21203Child.objects.select_related('parent').defer('parent__created') | ||||
|         self.assertQuerysetEqual(qs, [c], lambda x: x) | ||||
|         self.assertIs(qs[0].parent.parent_bool, True) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user