def most_commented(self, num=5, free=True):
"""
Returns the ``num`` objects with the highest comment counts,
in order.
Pass ``free=False`` if you're using the registered comment
model (Comment) instead of the anonymous comment model
(FreeComment).
"""
from django.db import connection
from django.contrib.comments import models as comment_models
from django.contrib.contenttypes.models import ContentType
if free:
comment_opts = comment_models.FreeComment._meta
else:
comment_opts = comment_models.Comment._meta
ctype = ContentType.objects.get_for_model(self.model)
query = """SELECT object_id, COUNT(*) AS score
FROM %s
WHERE content_type_id = %%s
AND is_public = 1
GROUP BY object_id
ORDER BY score DESC""" % comment_opts.db_table
cursor = connection.cursor()
cursor.execute(query, [ctype.id])
object_ids = [row[0] for row in cursor.fetchall()[:num]]
# Use ``in_bulk`` here instead of an ``id__in`` filter, because ``id__in``
# would clobber the ordering.
object_dict = self.in_bulk(object_ids)
return [object_dict[object_id] for object_id in object_ids]
Comments
This wasn't working for me, so I changed each reference to object_id to object_pk, to reference the correct column in django_comments
#