2010-06-01 8 views
5

Hay que implementar un sistema de votación a mano en un modelo.votación de estilo reddit con django

Mike DeSimone me ha ayudado mucho haciendo que esto funcione en primer lugar, pero necesito ampliar su trabajo.

Aquí está mi código actual

Ver

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) 

Plantilla

Modelo

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> 

Como se puede ver que tenemos 2 campos userUpVotes y userDownVotes en el modelo, estos serán calcular cómo ordenar los debates y respuestas.

¿Cómo implementaría estos 2 campos para ordenar las respuestas y las discusiones basadas en los votos?

¡Cualquier ayuda sería genial!

EDITAR

He añadido un método para mi modelo llamado vote_difference

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

que pueda usuario esta en mis plantillas para obtener el voto actual, sin embargo no puedo usar esto en mi opinión .py archivo para ordenar por este valor, de todos modos hay que incluir este valor en mi vista?

EDITAR (2)

poco a poco me he llegar allí, tengo que anotar 2 campos y hacer un cálculo sobre ellos, sin embargo, parece que no puedo hacer cálculos matemáticos básicos con anotaciones.

¿Alguna idea?

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

así hasta qué punto has llegado a esto? –

Respuesta

3

El algoritmo de reddit se basa en la fórmula para calcular la gravedad.Lo encontré de this website

Reddit Algoritmo

let t = (t1 – epoch) 

(donde t1 es el tiempo se hizo el poste)

let x be the number of up votes minus the number of down votes. 

Entonces,

let y be: 
  • 1 yo si hay más votos positivos que votos negativos,
  • -1 Si hay más votos bajos que votos positivos,
  • 0 si hay el mismo número.

hoy Deja

z = max({x,1}) 

Y hemos

ranking = C log10(z) + yt1 

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

Hay, gracias por la respuesta, ciertamente agrega algo de insistencia sobre cómo funciona Reddits. Sin embargo, pareces haber perdido el punto. Mi modelo tiene 2 campos (userUpVotes y userDownVotes), voy a resolver la diferencia entre estos valores para determinar cómo ordenar mis discusiones. userUpVotes podría tener 8 usuarios allí, donde userDownVotes podría tener 2. Así que el voto final sería userUpVotes - userDownVotes, que en ese caso podría ser +6. Ahora necesito ayuda para agregar los campos userDownVotes y userUpVotes, y eliminarlos entre ellos y ordenarlos según eso. – dotty

+0

Consulte la actualización para obtener información adicional. – dotty

+0

Perdón por no relacionar el algoritmo con Django. Sentí que esta información ayudaría, aunque me di cuenta de que no respondía la pregunta. –

1

Sé que esto no es una respuesta directa a su pregunta. Pero echando un vistazo a reddit's code puede ser muy útil. Me ayudó cuando tuve que implementar un algoritmo de recorte de imagen semi-inteligente similar al de reddit.

+0

el inconveniente es que utiliza el marco de pilones no el de django :( – dotty

4

Es posible que desee considerar desnormalizar su modelo al agregar un campo entero vote_score entero.

Entonces todo lo que tiene que hacer es anular save() para calcular la puntuación usando su método vote_difference().

Eso hace que la ordenación sea mucho más fácil y probablemente reduzca la cantidad de llamadas a la base de datos que está realizando.

Cuestiones relacionadas