Domanda

Hey voglio ordinare gli oggetti in base a un valore calcolato in Django ... come posso fare?

Ecco un modello di profilo di esempio utente basata su stack overflow che spiega la mia situazione:

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

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

Quindi, dico che voglio ordinare gli utenti di fama. Come lo faccio? So che non si può semplicemente fare questo:

Profile.objects.order_by("-reputation")

Grazie per il vostro aiuto tutti:)

È stato utile?

Soluzione

Se avete bisogno di fare l'ordinamento nel database (perché hai un sacco di dischi, e la necessità, ad esempio, li impaginare), l'unica vera opzione è quella di trasformare la reputazione in un campo denormalizzato (ad es aggiornato in un metodo save() sovrascritta il modello).

Altri suggerimenti

Dal momento che il codice di calcolo esiste solo all'interno di Python, è necessario eseguire l'ordinamento in Python così:

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

Al Django-1.8, è possibile ordinare un QuerySet utilizzando espressioni di query fintanto che il valore calcolato può essere reso in SQL. È inoltre possibile utilizzare annotations per il modello come order_by termine.

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

Le operazioni di base come +, -, *, / e ** possono essere utilizzati con F(). In aggiunta ci sono diverse altre funzioni come Count, Avg, Max, ...

Link:

Vedere anche questo SO Q & A: Ordina una QuerySet dal valore di campo aggregato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top