mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	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.
This commit is contained in:
		| @@ -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] | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user