1

我有两个这样的模型(简化):

class Post(models.Model):
    content = models.TextField('content')
    #...

class Vote(models.Model):
    user = ForeignKey(User)
    status = models.TextField(choices = some_choices, default = 'likes')
    post = models.ForeignKey(Post)
    #...

我想要做的是使用一些过滤器选择(使用一个查询)帖子,该过滤器带有一个特定(假设是当前)用户对这个帖子的投票(如果他没有投票也没关系),所以我可以输出所有帖子用户可以看到他喜欢哪些,不喜欢哪些,根本没有投票。

select_relatedfor Votemodel 在这里无济于事,因为无法过滤相关对象,所以我想我应该做一些额外的事情,但我无法弄清楚我应该传递哪些参数。

所以我想,它应该是这样的:

Post.objects.filter(content__contains="test").extra(tables="app_vote", where={'my_vote_status': 'something here perhaps?'})

您能帮我理解如何进行这样的查询吗?

UPD: schacki 提供了一个很好的解决方案,唯一的问题是我想从模板中访问不同用户的投票,比如Post.vote_by_mePost.vote_by_this_userPost.vote_by_top_user

4

3 回答 3

2

好吧,如果您确实想要答案,有时您应该自己寻找答案:)

以下是我解决问题的方法:

posts = Post.objects.filter(content__contains="test"
    ).extra(select={    
                    #extra selects vote status here for current user
                    "my_vote_status":"""SELECT status FROM blog_vote as vt
                                WHERE vt.user_id = %s
                                AND   vt.post_id = blog_posts.id
                             """ % (request.user.pk) #
    }, tables=['blog_vote'])

UPD:可能无需tables争论就可以工作

于 2012-09-29T11:30:58.293 回答
1

如果我正确理解您的要求,您将需要两个对象才能传递到上下文中。像这样尝试,其中 me 和 other_user 必须是有效的用户对象。

posts.vote_by_me=Post.objects.filter(content__contains="test",vote_set__status="something here perhaps?",vote_set__user=me)
posts.vote_by_other_user=Post.objects.filter(content__contains="test",vote_set__status="something here perhaps?",vote_set__user=other_user)
于 2012-09-24T14:36:55.327 回答
1

很难理解你想要什么,但这是另一种尝试。首先,获取您的帖子:

posts = Post.objects.filter(whatever)

现在你想要一组用户对帖子的所有投票,对吗?

votes = Vote.objects.filter(post__in=posts, user__in=users)

现在您所要做的就是根据用户 ID 将投票与帖子相关联:

votes_by_user_by_post = defaultdict(lambda: defaultdict(list))
for v in votes:
    votes_by_user_by_post[post.id][v.user_id].append(v)

for post in posts:
    post.votes_by_user = votes_by_user_by_post[post.id]

在性能方面,可以在两个查询和一些脚本中执行此操作。它们不是复杂的查询,脚本部分只是两个 for 循环。

于 2012-09-24T11:57:53.280 回答