Timmy's suggestion to use a subquery是p這是解決這類問題最簡單的方法,但子查詢幾乎不會像聯接那樣好,所以如果你有很多用戶,你可能會發現你需要更好的性能。
所以,重新使用蒂米的車型:
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
和GROUP BY
子句中。)
Django的對象關係映射系統不提供表達此查詢的方式。 (據我所知 - 我會很高興被告知否則! - 它只支持在一個連接上的聚合,而不是在這裏的兩個連接上)。但是當ORM不完全適合工作時,你總是可以運行一個raw SQL query,像這樣:
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
感謝蒂米,我越來越瘋狂,並啓用查詢! 現在,我這樣做,我得到一個數據庫錯誤:語法錯誤或在「選擇」附近 行8:選擇計數(*)從axiom_alto_likecomment – 2013-04-04 17:33:32
我明白了!這是因爲註釋,因爲某些原因,我不能註釋和額外的,所以我把所有東西都放到了extraa ^^再次感謝 – 2013-04-04 19:13:11