[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:
parent
dd9cedf16a
commit
b6d3212190
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue