mirror of https://github.com/django/django.git
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:
parent
fb90b7cda2
commit
f574220f09
|
@ -291,6 +291,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]
|
||||||
|
|
|
@ -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_b.lots_of_text, 'lots_of_text_b')
|
||||||
self.assertEqual(qs_c.c_a.name, 'a')
|
self.assertEqual(qs_c.c_a.name, 'a')
|
||||||
self.assertEqual(qs_c.c_b.name, 'b')
|
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
|
||||||
|
|
Loading…
Reference in New Issue