2014-06-16 122 views
0

我用Django編寫一個查詢有很大的問題。我的模型(只是它的重要部分 - 關係)看起來像這樣:如何在Django中通過一對外鍵過濾查詢?

class User(models.Model): 
    name = models.CharField(unique=True) 

class Topic(models.Model): 
    create_user = models.ForeignKey(User) 

class Post(models.Model): 
    topic = models.ForeignKey(Topic) 
    user = models.ForeignKey(User) 

它代表論壇應用程序的對象。我需要編寫查詢,返回最活躍評論員的用戶 - 他未創建主題的最高發布數。在SQL它應該是這樣的:

select user_id, count(*) 
from forum_app_post post 
inner join forum_app_topic topic on topic.id = post.topic_id 
where post.user_id != topic.create_user_id 
group by user_id; 

對我來說最難的部分是通過過濾在Django「post.user_id = topic.create_user_id!」的帖子。當我嘗試在一個過濾器中使用兩個字段時出現異常,並且我無法使用Django找到任何類型的解決方法。我不想使用原始SQL(使用Cursor對象)。

非常感謝!

回答

0

什麼:

Post.objects.exclude(user=F('topic__user')).values('user').annotate(Count('id')) 

F允許查詢集自我參照,因此我們排除具有相同的用戶作爲主題的創作者的帖子。然後我們按user_id分組。

+0

看起來它工作得很好,已經測試過它。謝謝! – user1953618