如何在Django中通过一对外键过滤查询?

时间:2014-06-16 18:49:42

标签: python mysql django foreign-keys

使用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;

对我而言,很难通过&post; user.id!= topic.create_user_id'来过滤帖子。在Django。当我尝试在一个过滤器中使用两个字段时,我得到例外,我无法使用Django找到任何解决方法。我不想使用原始SQL(使用Cursor对象)。

非常感谢!

1 个答案:

答案 0 :(得分:0)

怎么样:

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

F允许自我引用查询集,因此我们会排除与其主题的创建者具有相同用户的帖子。然后我们只按user_id分组。