2010-05-17 2 views
6

(ich Python neu bin und django so wenden Sie sich bitte für eine Sekunde mit mir. Ich entschuldige mich, wenn dies an anderer Stelle beantwortet worden ist, und es nicht finden konnte)Wie kann ich mit der App "django" und "django-voting" ein Suchfeld nach den Voten jedes Elements bestellen?

Lassen Sie uns sagen, dass ich ein Link-Modell haben und durch die django -Voting-Anwendung Benutzer können über Link-Instanzen abstimmen. Wie kann ich diese Link-Instanzen nach ihrer Punktzahl, z. zeige die mit der höheren Punktzahl zuerst an.

Ich nehme an, ich könnte den get_top Manager von django-voting verwenden, aber das würde mir nur die Linkinstanzen mit der höchsten Bewertung geben und andere Parameter, die ich hinzufügen möchte, nicht berücksichtigen (zum Beispiel die Links, die dazugehören) zu einem bestimmten Benutzer oder Paging oder was auch immer).

Meine Vermutung wäre, einen benutzerdefinierten Manager für mein Link-Modell zu schreiben, wo von mir eine queryset nach jedem Einzelteil Punktzahl filtere. Wenn ich richtig verstehe, dass ich jedes Element durchlaufen muss, überprüfe das Ergebnis und lege es dann in eine Liste (oder ein Wörterbuch), die dann nach der Punktzahl jedes Elements sortiert werden. Das würde kein Abfrage-Set zurückgeben, sondern ein Wörterbuch mit jedem Element.

Fehle ich hier etwas?

edit:

Hier ist eine abgespeckte Version des Link-Modell:

class Link(models.Model): 
    user = models.ForeignKey('auth.User') 
    category = models.ForeignKey(Category) 
    date = models.DateTimeField(auto_now_add=True, null=True, blank=True) 
    is_deleted = models.BooleanField(default=False, blank=True) 
    links = ValidLinkManager() 
    objects = models.Manager() 

und wenn ein Benutzer Stimmen Ich habe dies in meiner Sicht:

Vote.objects.record_vote(link, user, vote) 

wo Link ist Die Link-Instanz user ist eine Instanz von auth.User und vote ist entweder 1, 0 oder -1. Der ValidLinkManager filtert nur die Links heraus, bei denen is_deleted auf True gesetzt ist.

+0

Können Sie einige Code schreiben, möglicherweise, was Ihr Link-Modell sieht aus wie ...? – kafuchau

+0

in Ordnung ist es hier .. –

+0

Ich bin mir nicht ganz sicher, was Sie versuchen, hier zu tun. Versuchen Sie nur, die Anzeige der Stimmen anzuordnen? – Brant

Antwort

1

Die get_top Methode in VoteManager ist nicht so kompliziert. Schau dir seinen Code an (in managers.py:122). Sie können ganz einfach eine Version davon erstellen, die einen Filter als ein anderer Parameter akzeptiert und wendet sie auf die „Objekte“ queryset, nachdem sie es schafft, in Linie 158 - auf diese Weise Sie andere Filter wie die, die hinzufügen können Sie fehlt.

Vielleicht können Sie auch anbieten, dass als ein Patch zurück zum jonathan, und er es in django-Voting gestellt werden :)

0

ich eine generische Beziehung in meinem Modell zu verwenden, entschied:

votes = generic.GenericRelation(Vote) 

und dann aggregieren:

my_model.objects.annotate(num_votes=Count('votes')) 

In diesem Fall habe ich nur die Anzahl der Stimmen von den Objekten erhalten verlasse mich, aber Sie können Count mitwechseln, um einen Durchschnitt zu erhalten.

Seit this does not work with Django by default installierte ich django-generic-aggregation.

+0

danke Paolo für die Syntax – Bastian

Verwandte Themen