2010-06-01 9 views
5

Hay ich muss Hand implementieren ein Abstimmungssystem in ein Modell.Reddit Stil Abstimmung mit Django

Ich hatte eine riesige helfende Hand von Mike DeSimone, die diese Arbeit in erster Linie machen, aber ich muss seine Arbeit erweitern.

Hier ist meine aktuellen Code

Ansicht

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) 

Vorlage

Modell

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> 

Wie Sie haben wir 2 Felder userUpVotes und userDownVotes auf dem Modell sehen kann, werden diese berechnen, wie die Diskussionen und Antworten bestellen.

Wie würde ich diese 2 Felder implementieren, um die Antworten und Diskussionen basierend auf Stimmen zu bestellen?

Jede Hilfe wäre großartig!

EDIT

Ich habe eine Methode, um mein Modell vote_difference

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

Ich kann Benutzer dies in meinen Vorlagen genannt hinzugefügt, um die aktuelle Abstimmung zu bekommen, ich aber kann dies nicht in meiner Ansicht verwenden .py-Datei, um nach diesem Wert zu sortieren, ist dieser Wert in meiner Ansicht enthalten?

EDIT (2)

ich es langsam habe immer, ich brauche zwei Felder mit Anmerkungen versehen und eine Berechnung für sie tun, aber es scheint, dass ich nicht einfach mit annotate Mathematik Berechnung tun.

Irgendwelche Ideen?

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

so, wie Sie mit diesem weit sind? –

Antwort

3

Der Reddit-Algorithmus basiert auf der Formel zur Berechnung der Schwerkraft.Ich fand es von this website

Reddit Algorithmus

let t = (t1 – epoch) 

(wobei t1 die Zeit ist, die Post gemacht wurde)

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

Dann

let y be: 
  • 1 ich f gibt es mehr Up-Stimmen als Down-Stimmen,
  • -1 Wenn es mehr Down-Voets als Up-Stimmen gibt,
  • 0, wenn es die gleiche Nummer sind.

Jetzt

z = max({x,1}) 

und wir haben

ranking = C log10(z) + yt1 

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

Hay, danke für die Antwort, fügt sicherlich einige Insider hinzu, wie reddits funktioniert. Sie scheinen jedoch den Punkt verpasst zu haben. Mein Modell hat 2 Felder (userUpVotes und userDownVotes), die Differenz zwischen diesen Werten wird ausgearbeitet, um festzulegen, wie meine Diskussionen angeordnet werden sollen. userUpVotes könnte 8 Benutzer haben, wo userDownVotes 2 haben könnte. Die endgültige Abstimmung wäre also userUpVotes - userDownVotes, was in diesem Fall +6 sein könnte. Jetzt brauche ich Hilfe, wie man die userDownVotes und userUpVotes Felder zusammenfügt und sie voneinander entfernt und auf dieser Grundlage anordnet. – dotty

+0

Siehe Update für Zusatzinfo. – dotty

+0

Entschuldigung dafür, dass ich den Algorithmus nicht mit Django in Verbindung gebracht habe, ich fühlte, dass diese Information helfen würde, obwohl ich erkannte, dass sie die Frage nicht beantwortete. –

1

Lassen ich weiß, dass dies auf Ihre Frage keine direkte Antwort. Aber ein Blick in reddit's code kann sehr hilfreich sein. Es half mir, wenn ich einen semi-inteligenten Bildbeschneidungsalgorithmus implementieren musste, der reddit ähnlich ist.

+0

der Nachteil ist, dass es das Pylonen-Framework nicht den Django verwendet man :( – dotty

4

Sie können das Modell leicht demormalisieren, indem Sie ein ganzzahliges Feld vote_score hinzufügen.

Dann alles, was Sie tun müssen, überschreiben save(), um den Score mit Ihrer vote_difference() Methode zu berechnen.

Das macht die Sortierung viel einfacher und reduziert wahrscheinlich die Anzahl der Datenbankaufrufe, die Sie machen.