2013-10-07 146 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