diff --git a/CHANGES.rst b/CHANGES.rst index d0cf47f..cf71733 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,6 +9,7 @@ To be released - Add support for `Python 3.12` (GH-#545) - Drop support for `Python 3.7` (GH-#545) - Swedish translation (GH-#561) +- Use proper column name instead of attname (GH-#573) 4.3.1 (2022-11-15) ------------------ diff --git a/model_utils/managers.py b/model_utils/managers.py index 75d3d98..135629c 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -194,7 +194,7 @@ class InheritanceQuerySet(InheritanceQuerySetMixin, QuerySet): where_queries.append('(' + ' AND '.join([ '"{}"."{}" IS NOT NULL'.format( model._meta.db_table, - field.attname, # Should this be something else? + field.column, ) for field in model._meta.parents.values() ]) + ')') diff --git a/tests/models.py b/tests/models.py index d785e88..6d3f23f 100644 --- a/tests/models.py +++ b/tests/models.py @@ -67,6 +67,12 @@ class InheritanceManagerTestChild3(InheritanceManagerTestParent): parent_link=True, on_delete=models.CASCADE) +class InheritanceManagerTestChild3_1(InheritanceManagerTestParent): + parent_ptr = models.OneToOneField( + InheritanceManagerTestParent, db_column="custom_parent_ptr", + parent_link=True, on_delete=models.CASCADE) + + class InheritanceManagerTestChild4(InheritanceManagerTestParent): other_onetoone = models.OneToOneField( InheritanceManagerTestParent, related_name='non_inheritance_relation', diff --git a/tests/test_managers/test_inheritance_manager.py b/tests/test_managers/test_inheritance_manager.py index 102c6dd..60987bf 100644 --- a/tests/test_managers/test_inheritance_manager.py +++ b/tests/test_managers/test_inheritance_manager.py @@ -5,6 +5,7 @@ from tests.models import ( InheritanceManagerTestChild1, InheritanceManagerTestChild2, InheritanceManagerTestChild3, + InheritanceManagerTestChild3_1, InheritanceManagerTestChild4, InheritanceManagerTestGrandChild1, InheritanceManagerTestGrandChild1_2, @@ -141,6 +142,7 @@ class InheritanceManagerTests(TestCase): 'inheritancemanagertestchild1', 'inheritancemanagertestchild2', 'manual_onetoone', # this was set via parent_link & related_name + 'inheritancemanagertestchild3_1', 'child4_onetoone', ] self.assertEqual(set(results.subclasses), @@ -256,7 +258,9 @@ class InheritanceManagerUsingModelsTests(TestCase): objs = InheritanceManagerTestParent.objects.select_subclasses().order_by('pk') objsmodels = InheritanceManagerTestParent.objects.select_subclasses( InheritanceManagerTestChild1, InheritanceManagerTestChild2, - InheritanceManagerTestChild3, InheritanceManagerTestChild4, + InheritanceManagerTestChild3, + InheritanceManagerTestChild3_1, + InheritanceManagerTestChild4, InheritanceManagerTestGrandChild1, InheritanceManagerTestGrandChild1_2).order_by('pk') self.assertEqual(set(objs.subclasses), set(objsmodels.subclasses)) @@ -278,6 +282,7 @@ class InheritanceManagerUsingModelsTests(TestCase): models = (InheritanceManagerTestChild1, InheritanceManagerTestChild2, InheritanceManagerTestChild3, + InheritanceManagerTestChild3_1, InheritanceManagerTestChild4, InheritanceManagerTestGrandChild1, InheritanceManagerTestGrandChild1_2) @@ -426,6 +431,12 @@ class InheritanceManagerUsingModelsTests(TestCase): self.assertEqual([child3], list(results)) + def test_limit_to_specific_subclass_with_custom_db_column(self): + item = InheritanceManagerTestChild3_1.objects.create() + results = InheritanceManagerTestParent.objects.instance_of(InheritanceManagerTestChild3_1) + + self.assertEqual([item], list(results)) + def test_limit_to_specific_grandchild_class(self): grandchild1 = InheritanceManagerTestGrandChild1.objects.get() results = InheritanceManagerTestParent.objects.instance_of(InheritanceManagerTestGrandChild1)