Frage

Hey Ich mag Objekte sortieren, basierend auf einem berechneten Wert in django ... wie kann ich es tun?

Hier ist ein Beispiel Benutzerprofil-Modell auf Stack-Überlauf aus, dass meine missliche Lage erklärt:

class Profile(models.Model):
    user = models.ForeignKey(User)

    def get_reputation():
        ... 
        return reputation
    reputation = property(get_reputation)

So, sage ich Benutzer von Ruf sortieren möchten. Wie mache ich das? Ich weiß, man kann nicht einfach dies tun:

Profile.objects.order_by("-reputation")

Danke für Ihre Hilfe alle:)

War es hilfreich?

Lösung

Wenn Sie die Sortierung in der Datenbank tun müssen (weil Sie viele Datensätze haben, und müssen sie zB Paginieren), die einzige wirkliche Option ist Ruf in eine normalisierte Feld zu drehen (zB in einer überschriebenen save() Methode aktualisiert das Modell).

Andere Tipps

Da Ihr Berechnungscode nur innerhalb Python existiert, haben Sie auch die Sortierung in Python ausführen:

sorted (Profile.objects.all (), key = lambda p: p.reputation)

Wie von Django-1.8 ist es möglich, eine QuerySet zu sortieren mit Abfrageausdrücke solange der berechnete Wert kann in SQL wiedergegeben werden. Sie können auch annotations zum Modell verwenden, wie die order_by Begriff.

from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")

Grundoperationen wie +, -, *, / und ** mit F() verwendet werden. Darüber hinaus gibt es einige andere Funktionen wie Count, Avg, Max, ...

Links:

Siehe auch die SO Q & A: ein QuerySet von Aggregate Feldwert

Bestellen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top