Commit b6d32121 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

[1.6.x] Fixed #22508 -- Avoided overwriting select_related.

Previously, known related objects overwrote related objects loaded
though select_related. This could cancel the effect of select_related
when it was used over more than one level.

Thanks boxm for the bug report and timo for bisecting the regression.

Conflicts:
	tests/select_related_regress/tests.py

Backport of f574220f from master
parent dd9cedf1
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -246,6 +246,9 @@ class QuerySet(object):
            # Add the known related objects to the model, if there are any
            if self._known_related_objects:
                for field, rel_objs in self._known_related_objects.items():
                    # Avoid overwriting objects loaded e.g. by select_related
                    if hasattr(obj, field.get_cache_name()):
                        continue
                    pk = getattr(obj, field.get_attname())
                    try:
                        rel_obj = rel_objs[pk]
+10 −0
Original line number Diff line number Diff line
@@ -173,3 +173,13 @@ class SelectRelatedRegressTests(TestCase):

        self.assertEqual(Chick.objects.all()[0].mother.name, 'Hen')
        self.assertEqual(Chick.objects.select_related()[0].mother.name, 'Hen')

    def test_regression_22508(self):
        building = Building.objects.create(name='101')
        device = Device.objects.create(name="router", building=building)
        Port.objects.create(port_number='1', device=device)

        device = Device.objects.get()
        port = device.port_set.select_related('device__building').get()
        with self.assertNumQueries(0):
            port.device.building