Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #1130 from vdboor/issue_20442_get_for_id

Fixed #20442: NoneType error when fetching a stale ContentType with get_for_id
  • Loading branch information...
commit 9b22baddef1a6676f82fe7c112894cc8de045334 2 parents c6855e8 + 86e761f
@andrewgodwin andrewgodwin authored
View
6 django/contrib/contenttypes/models.py
@@ -118,11 +118,13 @@ def clear_cache(self):
def _add_to_cache(self, using, ct):
"""Insert a ContentType into the cache."""
- model = ct.model_class()
- key = (model._meta.app_label, model._meta.model_name)
+ # Note it's possible for ContentType objects to be stale; model_class() will return None.
+ # Hence, there is no reliance on model._meta.app_label here, just using the model fields instead.
+ key = (ct.app_label, ct.model)
self.__class__._cache.setdefault(using, {})[key] = ct
self.__class__._cache.setdefault(using, {})[ct.id] = ct
+
@python_2_unicode_compatible
class ContentType(models.Model):
name = models.CharField(max_length=100)
View
7 django/contrib/contenttypes/tests.py
@@ -274,3 +274,10 @@ def test_missing_model(self):
model = 'OldModel',
)
self.assertEqual(six.text_type(ct), 'Old model')
+ self.assertIsNone(ct.model_class())
+
+ # Make sure stale ContentTypes can be fetched like any other object.
+ # Before Django 1.6 this caused a NoneType error in the caching mechanism.
+ # Instead, just return the ContentType object and let the app detect stale states.
+ ct_fetched = ContentType.objects.get_for_id(ct.pk)
+ self.assertIsNone(ct_fetched.model_class())

0 comments on commit 9b22bad

Please sign in to comment.
Something went wrong with that request. Please try again.