Timmy 建议使用子查询可能是解决此类问题的最简单方法,但子查询的性能几乎没有联接好,因此如果您有很多用户,您可能会发现您需要更好的性能。
因此,重新使用 Timmy 的模型:
class User(models.Model):
pass
class Comment(models.Model):
user = models.ForeignKey(User, related_name="comments")
class Like(models.Model):
comment = models.ForeignKey(Comment, related_name="likes")
type = models.IntegerField()
您想要的查询在 SQL 中如下所示:
SELECT app_user.id, COUNT(app_like.id) AS total_likes
FROM app_user
LEFT OUTER JOIN app_comment
ON app_user.id = app_comment.user_id
LEFT OUTER JOIN app_like
ON app_comment.id = app_like.comment_id AND app_like.type = 1
GROUP BY app_user.id
ORDER BY total_likes DESCENDING
(如果您的实际User
模型有更多字段id
,那么您需要将它们全部包含在SELECT
andGROUP BY
子句中。)
Django 的对象关系映射系统没有提供表达这个查询的方法。(据我所知——如果不是这样,我很高兴被告知!——它只支持跨一个连接的聚合,而不是像这里那样跨两个连接的聚合。)但是当 ORM 不能完全胜任这项工作时,你始终可以运行原始 SQL 查询,如下所示:
sql = '''
SELECT app_user.id, COUNT(app_like.id) AS total_likes
# etc (as above)
'''
for user in User.objects.raw(sql):
print user.id, user.total_likes