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')
así hasta qué punto has llegado a esto? –