2013-10-07 180 views
-1

我有一個類似reddit的應用程序。有「職位」,人們在上面或下面投票。在我的模板中,我列出了所有帖子,並且希望能夠指出該人是否已經對帖子投了票。Django查詢集和外鍵

這有點令人困惑,因爲我將我的查詢集充滿帖子傳遞給模板,但當我迭代每個帖子來顯示它時,我也想知道是否有現有的投票。

下面是一些代碼:

class Submission(models.Model): 
    submitter = models.ForeignKey(User) 
    title = models.CharField("Title", max_length=200) 

class Vote(models.Model): 
    voter = models.ForeignKey(User) 
    submission = models.ForeignKey(Submission) 
    vote_value = models.FloatField() 

class SubmissionListView(ListView): 
    model = Submission 
    queryset = Submission.objects.extra(select={'total': 'IFNULL((SELECT SUM(vote_value) ' + \ 
     'FROM submissions_vote ' + 'WHERE submissions_vote.submission_id = ' + 'submissions_submission.id), ' + \ 
     '0)'}).order_by('-total') 
    paginate_by = 5 

好了,所以你可以看到我在做一個查詢集額外的(),因爲我想總結一下所有的選票每個崗位,並顯示在頁面上總。我認爲這是做到這一點的最有效的方法。

但是,如果查看該頁面的用戶對特定提交進行了投票,我需要以某種方式將該信息傳遞給模板。我知道我可以通過模板中的每個投票對象循環,並找出那裏,但似乎真的很低效。我一直在閱讀關於鏈接查詢集..是我需要在這裏做什麼?

回答

2

您可以添加另一個extra選擇:

queryset = Submission.objects.extra(
    select={'total': 'IFNULL((SELECT SUM(vote_value) ' + \ 
     'FROM submissions_vote ' + 'WHERE submissions_vote.submission_id = ' + \ 
     'submissions_submission.id), ' + '0)', 
    'has_voted': 'CASE WHEN %d IN (SELECT voter_id FROM submissions_vote WHERE ' + \ 
     'submissions_vote.submission_id = submissions_submission.id) THEN 1 ELSE 0 END' 
    }, select_params=(self.request.user.pk,)).order_by('-total') 

我知道這是不是最漂亮的解決方案。我通常不會經常寫自定義的sql,但我想不出更好的東西。很想知道你最終做了什麼。

編輯:既然你需要訪問self.request獲取,你需要重寫get_queryset方法:

def get_queryset(self): 
    return Submission.objects.extra(
    select={'total': 'IFNULL((SELECT SUM(vote_value) ' + \ 
     'FROM submissions_vote ' + 'WHERE submissions_vote.submission_id = ' + \ 
     'submissions_submission.id), ' + '0)', 
    'has_voted': 'CASE WHEN %d IN (SELECT voter_id FROM submissions_vote WHERE ' + \ 
     'submissions_vote.submission_id = submissions_submission.id) THEN 1 ELSE 0 END' 
    }, select_params=(self.request.user.pk,)).order_by('-total') 

做那,而不是queryset變量

+0

嗯...我喜歡你的想法,但我可以在這一點上似乎無法訪問self.request.user.pk。可能是因爲自我在這一點上不可用? – asolberg

+0

啊我不好。我沒有意識到你定義了queryset的位置。我編輯了我的答案來解決這個問題。 – jproffitt

+0

是的,似乎工作。除非我真的需要返回「vote_value」字段,以便我可以判斷投票是否已啓動或停止。我試圖說,然後選擇voter_id,vote_value .....然後vote_value其他0,但沒有工作。 – asolberg