From cf2c97b620b6190341c712ea96e82a66009326be Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Fri, 1 Feb 2013 22:53:11 -0700 Subject: [PATCH] Avoid overriding prior calls to select_related in select_subclasses. --- CHANGES.rst | 4 ++++ model_utils/managers.py | 4 ++++ model_utils/tests/tests.py | 11 +++++++++++ 3 files changed, 19 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6bff04b..3c0feaa 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,10 @@ CHANGES tip (unreleased) ---------------- +- Add workaround for https://code.djangoproject.com/ticket/16855 in + InheritanceQuerySet to avoid overriding prior calls to + ``select_related()``. Thanks ivirabyan. + - Added support for arbitrary levels of model inheritance in InheritanceManager. Thanks ivirabyan. (This feature only works in Django 1.6+ due to https://code.djangoproject.com/ticket/16572). diff --git a/model_utils/managers.py b/model_utils/managers.py index 63bed83..6005bf7 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -20,7 +20,11 @@ class InheritanceQuerySet(QuerySet): if django.VERSION < (1, 6, 0): levels = 1 subclasses = self._get_subclasses_recurse(self.model, levels=levels) + # workaround https://code.djangoproject.com/ticket/16855 + field_dict = self.query.select_related new_qs = self.select_related(*subclasses) + if isinstance(new_qs.query.select_related, dict) and isinstance(field_dict, dict): + new_qs.query.select_related.update(field_dict) new_qs.subclasses = subclasses return new_qs diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index c49bdf0..4d524cd 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -344,6 +344,17 @@ class InheritanceManagerTests(TestCase): self.child1) + def test_prior_select_related(self): + # Django 1.2 doesn't have assertNumQueries + if django.VERSION >= (1, 3): + with self.assertNumQueries(1): + obj = self.get_manager().select_related( + "inheritancemanagertestchild1").select_subclasses( + "inheritancemanagertestchild2").get(pk=self.child1.pk) + obj.inheritancemanagertestchild1 + + + class InheritanceManagerRelatedTests(InheritanceManagerTests): def setUp(self): self.related = InheritanceManagerTestRelated.objects.create()