Skip to content

Commit 6347e90

Browse files
authored
Merge pull request #632 from nlsfnr/master
Check for None on real_model in get_real_instance
2 parents 57eb5ff + d4456bd commit 6347e90

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

polymorphic/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,10 @@ def get_real_instance(self):
157157
retrieve objects, then the complete object with it's real class/type
158158
and all fields may be retrieved with this method.
159159
160+
If the model of the object's actual type does not exist (i.e. its
161+
ContentType is stale), this method raises a
162+
:class:`~polymorphic.models.PolymorphicTypeInvalid` exception.
163+
160164
.. note::
161165
Each method call executes one db query (if necessary).
162166
Use the :meth:`~polymorphic.managers.PolymorphicQuerySet.get_real_instances`
@@ -165,6 +169,11 @@ def get_real_instance(self):
165169
real_model = self.get_real_instance_class()
166170
if real_model == self.__class__:
167171
return self
172+
if real_model is None:
173+
raise PolymorphicTypeInvalid(
174+
f"ContentType {self.polymorphic_ctype_id} for {self.__class__} "
175+
f"#{self.pk} does not have a corresponding model!"
176+
)
168177
return real_model.objects.db_manager(self._state.db).get(pk=self.pk)
169178

170179
def __init__(self, *args, **kwargs):

polymorphic/tests/test_orm.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,15 @@ def test_manual_get_real_instance(self):
321321
o = Model2A.objects.non_polymorphic().get(field1="C1")
322322
assert o.get_real_instance().__class__ == Model2C
323323

324+
def test_get_real_instance_with_stale_content_type(self):
325+
ctype = ContentType.objects.create(app_label="tests", model="stale")
326+
o = Model2A.objects.create(field1="A1", polymorphic_ctype=ctype)
327+
328+
assert o.get_real_instance_class() is None
329+
match = "does not have a corresponding model"
330+
with pytest.raises(PolymorphicTypeInvalid, match=match):
331+
o.get_real_instance()
332+
324333
def test_non_polymorphic(self):
325334
self.create_model2abcd()
326335

0 commit comments

Comments
 (0)