wie durch einen berechneten Wert in django sortieren
-
06-09-2019 - |
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:)
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:
- Aggregation -
order_by
- Herstellung von Abfragen - Filter Felder auf einem Modell verweisen können
- Abfrageausdrücke - Built in Ausdrücke
Siehe auch die SO Q & A: ein QuerySet von Aggregate Feldwert
Bestellen