6

ヘイ私は投票システムをモデルに実装する必要があります。

そもそもMikeDeSimoneから多大な支援を受けてこの作品を制作してきましたが、彼の作品をさらに発展させる必要があります。

これが私の現在のコードです

意見

def show_game(request):
    game = Game.objects.get(pk=1)
    discussions = game.gamediscussion_set.filter(reply_to=None)
    d = {
        'game':game,
        'discussions':discussions
    }
    return render_to_response('show_game', d)

レンプレート

<ul>
    {% for discussion in discussions %}
    {{ discussion.html }}
    {% endfor %}
</ul>

モデル

class GameDiscussion(models.Model):
    game = models.ForeignKey(Game)
    message = models.TextField()
    reply_to = models.ForeignKey('self', related_name='replies', null=True, blank=True)
    created_on = models.DateTimeField(blank=True, auto_now_add=True)
    userUpVotes = models.ManyToManyField(User, blank=True, related_name='threadUpVotes')
    userDownVotes = models.ManyToManyField(User, blank=True, related_name='threadDownVotes')

    def html(self):
        DiscussionTemplate = loader.get_template("inclusions/discussionTemplate")
        return DiscussionTemplate.render(Context({
            'discussion': self,
            'replies': [reply.html() for reply in self.replies.all()]
    }))

DiscussionTemplate

<li>
    {{ discussion.message }}
    {% if replies %}
        <ul>
            {% for reply in replies %}
                {{ reply }}
            {% endfor %}
        </ul>
    {% endif %}
</li>

モデルにuserUpVotesとuserDownVotesの2つのフィールドがあることがわかるように、これらはディスカッションと返信の順序を計算します。

投票に基づいて返信とディスカッションを並べ替えるには、これら2つのフィールドをどのように実装しますか?

どんな助けでも素晴らしいでしょう!

編集

モデルにvote_differenceというメソッドを追加しました

    def vote_difference(self):
        return int(self.userUpVotes.count()) - int(self.userDownVotes.count())

テンプレートでこれを使用して現在の投票を取得できますが、view.pyファイルでこれを使用してこの値で並べ替えることはできません。この値をビューに含める方法はありますか?

編集(2)

ゆっくりとそこにたどり着きました。2つのフィールドに注釈を付けて計算する必要がありますが、注釈を使用して基本的な数学の計算を行うことはできないようです。

何か案は?

    discussions = game.gamediscussion_set.filter(reply_to=None).annotate( score= (Count('userUpVotes') - Count('userDownVotes')) ).order_by('-score')
4

4 に答える 4

4

vote_score整数フィールドを追加して、モデルをわずかに非正規化することを検討することをお勧めします。

次に、あなたがしなければならないのは、あなたの方法save()を使用してスコアを計算するためにオーバーライドすることです。vote_difference()

これにより、並べ替えがはるかに簡単になり、データベース呼び出しの数が減る可能性があります。

于 2010-06-02T13:01:18.007 に答える
3

redditアルゴリズムは、重力を計算するための式に基づいています。このウェブサイトから見つけました

Redditアルゴリズム

let t = (t1 – epoch)

(ここで、t1は投稿が行われた時間です)

let x be the number of up votes minus the number of down votes.

それで、

let y be:
  • 1反対票より賛成票の方が多い場合は、
  • -1賛成票よりも反対票の方が多い場合は、
  • 同じ番号がある場合は0。

さあ、

z = max({x,1})

そして、私たちは持っています

ranking = C log10(z) + yt1

Where C is a constant (C = 45000).
于 2010-06-01T14:10:33.927 に答える
1

私はこれがあなたの質問に対する直接の答えではないことを知っています。しかし、 redditのコードを覗いてみると非常に役立つ場合があります。redditに似たセミインテリジェントな画像トリミングアルゴリズムを実装する必要があるときに役立ちました。

于 2010-06-01T15:34:01.717 に答える
1

qhonuskan-votesという投票アプリケーションをリリースしました。こちらから確認できます:https ://github.com/miratcan/qhonuskan-votes

于 2012-02-28T19:21:35.353 に答える