diff --git a/django/db/models/query.py b/django/db/models/query.py index 44047d4689..48a7ffbbf1 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -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] diff --git a/tests/select_related_regress/tests.py b/tests/select_related_regress/tests.py index f6d21b2dd9..a05ec99074 100644 --- a/tests/select_related_regress/tests.py +++ b/tests/select_related_regress/tests.py @@ -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