summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/query.py3
-rw-r--r--tests/select_related_regress/tests.py10
2 files changed, 13 insertions, 0 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 043eac908b..abe882eaeb 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -291,6 +291,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 78d5838109..6b064ca582 100644
--- a/tests/select_related_regress/tests.py
+++ b/tests/select_related_regress/tests.py
@@ -188,3 +188,13 @@ class SelectRelatedRegressTests(TestCase):
self.assertEqual(qs_c.c_b.lots_of_text, 'lots_of_text_b')
self.assertEqual(qs_c.c_a.name, 'a')
self.assertEqual(qs_c.c_b.name, 'b')
+
+ 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