Ein QuerySet zusammengefassten Feld Wert
Sagen wir, ich habe das folgende Modell:
class Contest:
title = models.CharField( max_length = 200 )
description = models.TextField()
class Image:
title = models.CharField( max_length = 200 )
description = models.TextField()
contest = models.ForeignKey( Contest )
user = models.ForeignKey( User )
def score( self ):
return self.vote_set.all().aggregate( models.Sum( 'value' ) )[ 'value__sum' ]
class Vote:
value = models.SmallIntegerField()
user = models.ForeignKey( User )
image = models.ForeignKey( Image )
Benutzer einer Website beitragen können, Ihre Bilder auf mehrere Wettbewerbe. Dann andere Benutzer können abstimmen, nach oben oder nach unten.
Alles einwandfrei funktioniert, aber jetzt will ich eine Seite anzeigen, auf denen Benutzer können alle Beiträge auf einen bestimmten wettkampf. Die Bilder sind in der Reihenfolge Ihrer Punktzahl.
Deshalb habe ich versucht, die folgenden:
Contest.objects.get( pk = id ).image_set.order_by( 'score' )
Wie ich es befürchtet habe, es funktioniert nicht, weil 'score'
ist kein Datenbank-Feld, das könnte in Abfragen verwendet werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oh, natürlich habe ich vergessen neue aggregation-Unterstützung in Django und seine
annotate
Funktionalität.Also Abfrage kann wie folgt Aussehen:
Schreiben Sie Ihre eigene Art in Python sehr einfach.
Dies funktioniert gut, weil wir sortiert in der Liste, die wir gehen, um auf der Vorlage.
Den db-level
order_by
nicht Sortieren queryset durch das Modell der python-Methode.Die Lösung ist die Einführung
score
FeldImage
Modell und berechnen es auf jedenVote
update. Irgendeine Art von Denormalisierung. Wenn Sie können, um zu Sortieren es.