diff --git a/django/contrib/comments/managers.py b/django/contrib/comments/managers.py
index 499feee..45c81c3 100644
--- a/django/contrib/comments/managers.py
+++ b/django/contrib/comments/managers.py
@@ -1,14 +1,30 @@
 from django.db import models
+from django.conf import settings
 from django.contrib.contenttypes.models import ContentType
 from django.utils.encoding import force_unicode
 
-class CommentManager(models.Manager):
-
+class CommentQuerySet(models.query.QuerySet):
     def in_moderation(self):
         """
         QuerySet for all comments currently in the moderation queue.
         """
-        return self.get_query_set().filter(is_public=False, is_removed=False)
+        return self.filter(is_public=False, is_removed=False)
+
+    def not_in_moderation(self):
+        """
+        QuerySet for all comments currently not in the moderation queue, i.e.,
+        all the comments that are publicly viewable.
+        """
+        # The is_public and is_removed fields are implementation details of the
+        # built-in comment model's spam filtering system, so they might not
+        # be present on a custom comment model subclass. If they exist, we
+        # should filter on them.
+        field_names = [f.name for f in self.model._meta.fields]
+        if 'is_public' in field_names:
+            qs = self.filter(is_public=True)
+        if getattr(settings, 'COMMENTS_HIDE_REMOVED', True) and 'is_removed' in field_names:
+            qs = qs.filter(is_removed=False)
+        return qs
 
     def for_model(self, model):
         """
@@ -16,7 +32,32 @@ class CommentManager(models.Manager):
         a class).
         """
         ct = ContentType.objects.get_for_model(model)
-        qs = self.get_query_set().filter(content_type=ct)
+        qs = self.filter(content_type=ct)
         if isinstance(model, models.Model):
             qs = qs.filter(object_pk=force_unicode(model._get_pk_val()))
         return qs
+
+class CommentManager(models.Manager):
+
+    def get_query_set(self):
+        return CommentQuerySet(self.model, using=self._db)
+
+    def in_moderation(self):
+        """
+        QuerySet for all comments currently in the moderation queue.
+        """
+        return self.get_query_set().in_moderation()
+
+    def not_in_moderation(self):
+        """
+        QuerySet for all comments currently not in the moderation queue, i.e.,
+        all the comments that are publicly viewable.
+        """
+        return self.get_query_set().not_in_moderation()
+
+    def for_model(self, model):
+        """
+        QuerySet for all comments for a particular model (either an instance or
+        a class).
+        """
+        return self.get_query_set().for_model(model)
diff --git a/django/contrib/comments/templatetags/comments.py b/django/contrib/comments/templatetags/comments.py
index ce1825e..0aded1c 100644
--- a/django/contrib/comments/templatetags/comments.py
+++ b/django/contrib/comments/templatetags/comments.py
@@ -79,17 +79,7 @@ class BaseCommentNode(template.Node):
             site__pk     = settings.SITE_ID,
         )
 
-        # The is_public and is_removed fields are implementation details of the
-        # built-in comment model's spam filtering system, so they might not
-        # be present on a custom comment model subclass. If they exist, we
-        # should filter on them.
-        field_names = [f.name for f in self.comment_model._meta.fields]
-        if 'is_public' in field_names:
-            qs = qs.filter(is_public=True)
-        if getattr(settings, 'COMMENTS_HIDE_REMOVED', True) and 'is_removed' in field_names:
-            qs = qs.filter(is_removed=False)
-
-        return qs
+        return qs.not_in_moderation()
 
     def get_target_ctype_pk(self, context):
         if self.object_expr:
diff --git a/tests/regressiontests/comment_tests/tests/model_tests.py b/tests/regressiontests/comment_tests/tests/model_tests.py
index 2cbf66f..36be29b 100644
--- a/tests/regressiontests/comment_tests/tests/model_tests.py
+++ b/tests/regressiontests/comment_tests/tests/model_tests.py
@@ -30,6 +30,11 @@ class CommentManagerTests(CommentTestCase):
         moderated_comments = list(Comment.objects.in_moderation().order_by("id"))
         self.assertEqual(moderated_comments, [c1, c2])
 
+    def testGetCommentsForModel(self):
+        c1, c2, c3, c4 = self.createSomeComments()
+        comments_for_model = list(Comment.objects.for_model(Article).order_by("id"))
+        self.assertEqual(comments_for_model, [c1, c3])
+
     def testRemovedCommentsNotInModeration(self):
         """Removed comments are not considered in moderation"""
         c1, c2, c3, c4 = self.createSomeComments()
