стиль reddit, голосующий с django

Шаг скрутки я должен вручить 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')
6
задан dotty 1 June 2010 в 14:56
поделиться

3 ответа

Алгоритм 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:
  • 1 если голосов "за" больше, чем "против",
  • -1 если голосов "против" больше, чем "за",
  • 0 если их одинаковое количество.

Теперь Let

z = max({x,1})

And We Have

ranking = C log10(z) + yt1

Where C is a constant (C = 45000).
3
ответ дан 10 December 2019 в 02:43
поделиться

Я знаю, что это не прямой ответ на ваш вопрос. Но заглянуть в код reddit может быть очень полезно. Это помогло мне, когда мне нужно было реализовать полуинтеллектуальный алгоритм обрезки изображений, похожий на алгоритм reddit.

1
ответ дан 10 December 2019 в 02:43
поделиться

Возможно, вы захотите немного денормализовать вашу модель, добавив целочисленное поле vote_score.

Тогда вам нужно будет только переопределить save() для вычисления оценки с помощью вашего метода vote_difference().

Это значительно упрощает сортировку и, вероятно, уменьшает количество обращений к базе данных.

4
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: