diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py index 1bb07e0d52..6d919b4237 100644 --- a/django/contrib/contenttypes/models.py +++ b/django/contrib/contenttypes/models.py @@ -13,6 +13,7 @@ class ContentTypeManager(models.Manager): ct = self.__class__._cache[self.db][(app_label, model)] except KeyError: ct = self.get(app_label=app_label, model=model) + self._add_to_cache(self.db, ct) return ct def _get_opts(self, model): diff --git a/django/contrib/contenttypes/tests.py b/django/contrib/contenttypes/tests.py index f2a338e1d4..3b7906c812 100644 --- a/django/contrib/contenttypes/tests.py +++ b/django/contrib/contenttypes/tests.py @@ -51,8 +51,8 @@ class ContentTypesTests(TestCase): def test_lookup_cache(self): """ Make sure that the content type cache (see ContentTypeManager) - works correctly. Lookups for a particular content type -- by model or - by ID -- should hit the database only on the first lookup. + works correctly. Lookups for a particular content type -- by model, ID + or natural key -- should hit the database only on the first lookup. """ # At this point, a lookup for a ContentType should hit the DB @@ -60,16 +60,30 @@ class ContentTypesTests(TestCase): ContentType.objects.get_for_model(ContentType) # A second hit, though, won't hit the DB, nor will a lookup by ID + # or natural key with self.assertNumQueries(0): ct = ContentType.objects.get_for_model(ContentType) with self.assertNumQueries(0): ContentType.objects.get_for_id(ct.id) + with self.assertNumQueries(0): + ContentType.objects.get_by_natural_key('contenttypes', + 'contenttype') # Once we clear the cache, another lookup will again hit the DB ContentType.objects.clear_cache() with self.assertNumQueries(1): ContentType.objects.get_for_model(ContentType) + # The same should happen with a lookup by natural key + ContentType.objects.clear_cache() + with self.assertNumQueries(1): + ContentType.objects.get_by_natural_key('contenttypes', + 'contenttype') + # And a second hit shouldn't hit the DB + with self.assertNumQueries(0): + ContentType.objects.get_by_natural_key('contenttypes', + 'contenttype') + def test_get_for_models_empty_cache(self): # Empty cache. with self.assertNumQueries(1): diff --git a/tests/regressiontests/comment_tests/tests/templatetag_tests.py b/tests/regressiontests/comment_tests/tests/templatetag_tests.py index de397678cd..0b036ce921 100644 --- a/tests/regressiontests/comment_tests/tests/templatetag_tests.py +++ b/tests/regressiontests/comment_tests/tests/templatetag_tests.py @@ -130,8 +130,7 @@ class CommentTemplateTagTests(CommentTestCase): with self.assertNumQueries(4): self.testRenderCommentListFromObject() - # Force the CT to be cached - ct = ContentType.objects.get_for_model(Article) + # CT's should be cached with self.assertNumQueries(3): self.testRenderCommentListFromObject() @@ -141,7 +140,6 @@ class CommentTemplateTagTests(CommentTestCase): with self.assertNumQueries(4): self.verifyGetCommentList() - ct = ContentType.objects.get_for_model(Author) with self.assertNumQueries(3): self.verifyGetCommentList() @@ -151,7 +149,6 @@ class CommentTemplateTagTests(CommentTestCase): with self.assertNumQueries(3): self.testRenderCommentForm() - ct = ContentType.objects.get_for_model(Article) with self.assertNumQueries(2): self.testRenderCommentForm() @@ -161,7 +158,6 @@ class CommentTemplateTagTests(CommentTestCase): with self.assertNumQueries(3): self.testGetCommentForm() - ct = ContentType.objects.get_for_model(Article) with self.assertNumQueries(2): self.testGetCommentForm() @@ -171,6 +167,5 @@ class CommentTemplateTagTests(CommentTestCase): with self.assertNumQueries(3): self.verifyGetCommentCount() - ct = ContentType.objects.get_for_model(Article) with self.assertNumQueries(2): self.verifyGetCommentCount()