Question

Hay j'ai besoin de main implemeneting un système de vote dans un modèle.

J'ai eu un énorme coup de main de Mike DeSimone faire ce travail en premier lieu, mais je dois élargir son travail.

Voici mon code actuel

Afficher

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)

Modèle

<ul>
    {% for discussion in discussions %}
    {{ discussion.html }}
    {% endfor %}
</ul>

Modèle

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>

Comme vous pouvez le voir, nous avons 2 champs userUpVotes et userDownVotes sur le modèle, ceux-ci calculeront comment commander les discussions et les réponses.

Comment puis-je mettre en œuvre ces 2 champs pour commander les réponses et discussions basées sur les votes?

Toute aide serait génial!

EDIT

J'ai ajouté une méthode pour mon modèle appelé vote_difference

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

Je peux l'utilisateur dans mes modèles pour obtenir le vote en cours, mais je ne peux pas l'utiliser dans mon dossier view.py à l'ordre de cette valeur, est de toute façon d'inclure cette valeur à mon avis?

EDIT (2)

Je l'ai lentement se il, je dois annoter 2 champs et faire un calcul sur eux, mais il semble que je ne peux pas faire le calcul de mathématiques de base avec annoter.

Toutes les idées?

    discussions = game.gamediscussion_set.filter(reply_to=None).annotate( score= (Count('userUpVotes') - Count('userDownVotes')) ).order_by('-score')
Était-ce utile?

La solution

L'algorithme reddit est basé sur la formule de calcul de la gravité. Je l'ai trouvé de ce site

Reddit algorithme

let t = (t1 – epoch)

(où t1 est le moment où le poste a été faite)

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

Alors,

let y be:
  • 1 s'il y a plus des votes que vers le bas votes,
  • -1 S'il y a plus bas voets que des votes,
  • 0 s'il y a le même nombre.

Soit

z = max({x,1})

Nous avons cependant

ranking = C log10(z) + yt1

Where C is a constant (C = 45000).

Autres conseils

Vous pouvez envisager dénormaliser votre modèle légèrement en ajoutant un champ entier vote_score.

Alors tout ce que vous avez à faire est prioritaire save() pour calculer le score en utilisant votre méthode vote_difference().

Cela rend beaucoup plus facile le tri, et réduit probablement le nombre d'appels de base de données que vous faites.

Je sais que ce n'est pas une réponse directe à votre question. Mais un coup d'oeil dans la prise le code de reddit peut être très utile. Cela m'a aidé quand je devais mettre en œuvre un algorithme image semi-inteligent culture similaire à reddit de.

Je publié une demande de vote appelé qhonuskan-voix, vous pouvez le vérifier à partir d'ici: https: // github .com / miratcan / qhonuskan-votes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top