2010-06-01 3 views
5

Hay Мне нужно перенести внедрение системы голосования в модель.голосование в стиле reddit с django

У меня была огромная помощь от Майка Де Симона, делающего эту работу в первую очередь, но мне нужно расширить его работу.

Вот мой текущий код

Посмотреть

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) 

Шаблон

Модель

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 поля для заказа ответов и обсуждений на основе голосов?

Любая помощь будет замечательной!

EDIT

Я добавил метод моей модели под названием vote_difference

def vote_difference(self): 
     return int(self.userUpVotes.count()) - int(self.userDownVotes.count()) 

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

EDIT (2)

Я медленно попасть туда, мне нужно аннотировать 2 поля и сделать расчет на них, однако, кажется, что я не могу сделать расчет базовой математике с аннотирования.

Любые идеи?

discussions = game.gamediscussion_set.filter(reply_to=None).annotate(score= (Count('userUpVotes') - Count('userDownVotes'))).order_by('-score') 
+0

так, как далеко вы получите с этим? –

ответ

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 я f есть более высокие голоса, чем пустые голоса,
  • -1 Если голосов больше, чем голосов,
  • 0 если есть одинаковое число.

Теперь Пусть

z = max({x,1}) 

И у нас есть

ranking = C log10(z) + yt1 

Where C is a constant (C = 45000). 
+0

Хей, спасибо за ответ, конечно добавляет некоторые insite в как reddits работает. Однако вы, кажется, пропустили точку. Моя модель имеет 2 поля (userUpVotes и userDownVotes), плохо разобраться в различиях между этими значениями, чтобы определить, как упорядочить мои обсуждения. userUpVotes может содержать 8 пользователей, где userDownVotes может иметь 2. Таким образом, окончательным голосованием будет userUpVotes - userDownVotes, который в этом случае может быть +6. Теперь мне нужна помощь, как добавить поля userDownVotes и userUpVotes и отнять их друг от друга и заказать на основе этого. – dotty

+0

См. Обновление для дополнительной информации. – dotty

+0

Извините за то, что я не связывал алгоритм с Django, я чувствовал, что эта информация поможет, хотя я понял, что он не ответил на вопрос. –

1

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

+0

Недостатком является то, что он использует рамки pylons, а не django one :( – dotty

4

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

Затем все, что вам нужно сделать, это переопределить save(), чтобы рассчитать оценку, используя метод vote_difference().

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