用django投票的reddit风格

时间:2010-06-01 13:30:47

标签: django reddit vote

Hay我需要将投票系统实施到模型中。

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

DiscussionTemplate

<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 个答案:

答案 0 :(得分:4)

您可能需要考虑通过添加vote_score整数字段来轻微地对模型进行非规范化。

然后,您只需覆盖save()即可使用vote_difference()方法计算分数。

这使排序变得更加容易,并且可能会减少您正在进行的数据库调用次数。

答案 1 :(得分:3)

reddit算法基于计算重力的公式。我是从this website

找到的

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).

答案 2 :(得分:1)

我知道这不是你问题的直接答案。但是看一看reddit's code可能会非常有帮助。当我不得不实现类似于reddit的半智能图像裁剪算法时,它帮助了我。

答案 3 :(得分:1)

我发布了一个名为qhonuskan-votes的投票申请表,你可以从这里查看:https://github.com/miratcan/qhonuskan-votes