6

干草我需要手动将投票系统实施到模型中。

首先,迈克·德西蒙(Mike DeSimone)对我提供了巨大的帮助,但我需要扩展他的工作。

这是我当前的代码

看法

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()]
    }))

讨论模板

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

如您所见,我们在模型上有 2 个字段 userUpVotes 和 userDownVotes,它们将计算如何对讨论和回复进行排序。

我将如何实施这两个字段以根据投票排序回复和讨论?

任何帮助都会很棒!

编辑

我在我的模型中添加了一个名为 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 回答