subplots - python plot name figure



Ordnen Sie einen QuerySet nach dem aggregierten Feldwert an (2)

Sagen wir, ich habe folgendes 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 )

Die Benutzer einer Website können ihre Bilder zu mehreren Wettbewerben beitragen. Dann können andere Benutzer sie nach oben oder unten abstimmen. Alles funktioniert gut, aber jetzt möchte ich eine Seite anzeigen, auf der Benutzer alle Beiträge zu einem bestimmten Wettbewerb sehen können. Die Bilder müssen nach ihrer Punktzahl geordnet sein. Deshalb habe ich folgendes versucht:

Contest.objects.get( pk = id ).image_set.order_by( 'score' )

Wie ich befürchtet habe, funktioniert es nicht, da 'score' kein Datenbankfeld ist, das in Abfragen verwendet werden könnte.

https://src-bin.com


Answer #1

Die order_by -Ebene order_by kann die order_by nicht nach der Python-Methode des Modells sortieren.

Die Lösung besteht darin, ein score in das Image Modell einzuführen und es bei jedem Vote Update neu zu berechnen. Eine Art Denormalisierung. Wenn Sie können danach sortieren.


Answer #2

Oh, natürlich vergesse ich die neue Aggregationsunterstützung in Django und seine annotate Funktionalität.

So könnte die Abfrage so aussehen:

Contest.objects.get(pk=id).image_set.annotate(score=Sum('vote__value')).order_by( 'score' )




order