diff --git a/CHANGES.rst b/CHANGES.rst index 6f5ecd8..cd1bb7d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,6 +3,7 @@ CHANGES 4.0.1 (unreleased) ------------------ +- Update InheritanceQuerySetMixin to avoid querying too much tables - TimeStampedModel now automatically adds 'modified' field as an update_fields parameter even if it is forgotten while using save() - `FieldTracker` now marks fields as not changed after `refresh_from_db` diff --git a/model_utils/managers.py b/model_utils/managers.py index 105794b..3725eab 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -75,7 +75,10 @@ class InheritanceQuerySetMixin: # workaround https://code.djangoproject.com/ticket/16855 previous_select_related = self.query.select_related - new_qs = self.select_related(*subclasses) + if subclasses: + new_qs = self.select_related(*subclasses) + else: + new_qs = self previous_is_dict = isinstance(previous_select_related, dict) new_is_dict = isinstance(new_qs.query.select_related, dict) if previous_is_dict and new_is_dict: diff --git a/tests/test_managers/test_inheritance_manager.py b/tests/test_managers/test_inheritance_manager.py index 2481b5c..43ce50b 100644 --- a/tests/test_managers/test_inheritance_manager.py +++ b/tests/test_managers/test_inheritance_manager.py @@ -487,6 +487,14 @@ class InheritanceManagerRelatedTests(InheritanceManagerTests): id=self.child1.id), self.child1) + def test_get_method_with_select_subclasses_check_for_useless_join(self): + child4 = InheritanceManagerTestChild4.objects.create(related=self.related, other_onetoone=self.child1) + self.assertEqual( + str(InheritanceManagerTestChild4.objects.select_subclasses().filter( + id=child4.id).query), + str(InheritanceManagerTestChild4.objects.select_subclasses().select_related(None).filter( + id=child4.id).query)) + def test_annotate_with_select_subclasses(self): qs = InheritanceManagerTestParent.objects.select_subclasses().annotate( models.Count('id'))