-1

reddit のようなアプリケーションがあります。「投稿」があり、人々はそれらに賛成または反対の投票をします。私のテンプレートでは、すべての投稿を一覧表示し、その人が既に投稿に投票したかどうかを示すことができるようにしたいと考えています。

投稿でいっぱいのクエリセットをテンプレートに渡すので、少し混乱しますが、各投稿を繰り返し表示するときに、既存の投票があるかどうかも知りたいです。

ここにいくつかのコードがあります:

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

各投稿のすべての投票を合計してページに合計を表示したいので、queryset extra() を実行していることがわかります。これが最も効率的な方法だと思います。

しかし、ページを表示しているユーザーが特定の投稿に投票した場合、その情報を何らかの方法でテンプレートに伝える必要があります。テンプレート内の各投票オブジェクトをループしてそこにあることを理解できることはわかっていますが、それは非常に非効率的です。私はクエリセットの連鎖について読んできました..それは私がここで行う必要があることですか?

4

1 に答える 1

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変数の代わりにそれを行います

于 2013-10-08T00:17:09.600 に答える