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')
答案 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:
现在让
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