2012-09-23 120 views
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_relatedVoteVote模型在這裏沒有幫助,因爲相關的對象不能過濾,所以我想我應該做一些額外的事情,但我不知道應該通過什麼參數。

所以我想,應該是這樣的:

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

能否請你幫我瞭解如何使這樣的查詢?

UPD: schacki提供了一個很好的解決方案,唯一的問題是,我想從模板訪問由不同的用戶投票,somtehing像Post.vote_by_mePost.vote_by_this_userPost.vote_by_top_user

+2

你是如何關聯'Post'和'Vote'?你正在從你的例子 – Claudiu

+0

oops中留下一些重要的東西,你是對的。謝謝你指出,我已經增加了與問題的關係。 – DataGreed

回答

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論點

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-loops。

+0

好吧,但是我想通過額外的方式來完成,所以我實際上可以選擇來自2個或更多不同用戶的投票並將它們保存爲帖子的不同變量(典型情況是查看某個人對帖子的投票並查看您的投票)在同一視圖中的帖子) – DataGreed

+0

這不是我想要這樣做的唯一原因實際上,但這個故事有點長:) – DataGreed

+1

你能否更詳細地解釋,你想要做什麼,而不是假設它必須是額外完成。這將有助於所有人提出最佳解決方案。請用你自己的話來描述你想要檢索的內容。 , – schacki

1

如果我正確理解您的要求,您將需要兩個對象傳入上下文。像這樣嘗試,我和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) 
+0

謝謝,這是一個很好的解決方案,唯一的問題是,我想引用訪問這個在模板中投票。像Post.vote_by_me和Post.vote_by_this_user – DataGreed

+0

還有另一個問題 - 它不會返回指定用戶的投票沒有投票 – DataGreed

+1

我很抱歉,我似乎並不瞭解您的要求,然後;如果你想要一個正確的答案,提供更多的細節,我們無法猜測。 – schacki