Commit 9972a101 authored by Anssi Kääriäinen's avatar Anssi Kääriäinen
Browse files

[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 bf13c75c from master.
parent 5b97b99a
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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] + [
+9 −0
Original line number Diff line number Diff line
@@ -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)
+10 −2
Original line number Diff line number Diff line
@@ -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)