Шаг скрутки я должен вручить implemeneting систему голосования в модель.
У меня была огромная рука помощи от 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 на модели, они вычислят, как заказать обсуждения и ответы.
Как я реализовал бы эти 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')
Алгоритм Reddit основан на формуле расчета гравитации. Я нашел ее на этом сайте
Reddit Algorithm
let t = (t1 – epoch)
(где t1 - время создания сообщения)
let x be the number of up votes minus the number of down votes.
Затем,
let y be:
Теперь Let
z = max({x,1})
And We Have
ranking = C log10(z) + yt1
Where C is a constant (C = 45000).
Я знаю, что это не прямой ответ на ваш вопрос. Но заглянуть в код reddit может быть очень полезно. Это помогло мне, когда мне нужно было реализовать полуинтеллектуальный алгоритм обрезки изображений, похожий на алгоритм reddit.
Возможно, вы захотите немного денормализовать вашу модель, добавив целочисленное поле vote_score
.
Тогда вам нужно будет только переопределить save()
для вычисления оценки с помощью вашего метода vote_difference()
.
Это значительно упрощает сортировку и, вероятно, уменьшает количество обращений к базе данных.