mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	[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
			
			
This commit is contained in:
		| @@ -246,6 +246,9 @@ class QuerySet(object): | |||||||
|             # Add the known related objects to the model, if there are any |             # Add the known related objects to the model, if there are any | ||||||
|             if self._known_related_objects: |             if self._known_related_objects: | ||||||
|                 for field, rel_objs in self._known_related_objects.items(): |                 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()) |                     pk = getattr(obj, field.get_attname()) | ||||||
|                     try: |                     try: | ||||||
|                         rel_obj = rel_objs[pk] |                         rel_obj = rel_objs[pk] | ||||||
|   | |||||||
| @@ -173,3 +173,13 @@ class SelectRelatedRegressTests(TestCase): | |||||||
|  |  | ||||||
|         self.assertEqual(Chick.objects.all()[0].mother.name, 'Hen') |         self.assertEqual(Chick.objects.all()[0].mother.name, 'Hen') | ||||||
|         self.assertEqual(Chick.objects.select_related()[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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user