diff --git a/.gitignore b/.gitignore index 68cead8..4bb1a0f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ HGREV .coverage .tox/ Django-*.egg +*.pyc \ No newline at end of file diff --git a/README.rst b/README.rst index e2b32af..3e7591d 100644 --- a/README.rst +++ b/README.rst @@ -263,6 +263,11 @@ be returned as their actual type, you can pass subclass names to nearby_places = Place.objects.select_subclasses("restaurant") # restaurants will be Restaurant instances, bars will still be Place instances +Also it provides syntax sugar for `get()` method:: + + place = Place.objects.get_subclass(id=some_id) + # "place" will automatically be an instance of Place, Restaurant, or Bar + If you don't explicitly call ``select_subclasses()``, an ``InheritanceManager`` behaves identically to a normal ``Manager``; so it's safe to use as your default manager for the model. diff --git a/model_utils/managers.py b/model_utils/managers.py index 8542966..02ab29b 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -43,6 +43,9 @@ class InheritanceManager(models.Manager): def select_subclasses(self, *subclasses): return self.get_query_set().select_subclasses(*subclasses) + def get_subclass(self, *args, **kwargs): + return self.get_query_set().select_subclasses().get(*args, **kwargs) + class InheritanceCastMixin(object): def cast(self): diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 816ccbe..544a5f4 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -353,6 +353,11 @@ if django.VERSION >= (1, 2): set([self.child1, InheritanceManagerTestParent(pk=self.child2.pk)])) + def test_get_subclass(self): + self.assertEquals( + self.get_manager().get_subclass(pk=self.child1.pk), + self.child1) + class InheritanceManagerRelatedTests(InheritanceManagerTests): def setUp(self):