Pregunta

Hey, quiero clasificar objetos en base a un valor calculado en Django ... ¿cómo lo hago?

Este es un modelo de perfil de usuario de ejemplo basado en desbordamiento de pila que explica mi situación:

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

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

Por lo tanto, digo que quiero ordenar los usuarios por su reputación. ¿Cómo puedo hacer eso? Sé que no se puede simplemente hacer esto:

Profile.objects.order_by("-reputation")

Gracias por su ayuda a todos:)

¿Fue útil?

Solución

Si es necesario realizar la ordenación en la base de datos (porque tiene un montón de registros, y la necesidad de, por ejemplo, paginate ellos), la única opción real es convertir la reputación en un campo sin normalizar (por ejemplo, actualizada en un método save() reemplazado en el modelo).

Otros consejos

Desde que existe el código de cálculo sólo dentro de Python, usted tiene que realizar la clasificación en Python, así:

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

A partir de Django-1.8, es posible ordenar un QuerySet usando expresiones de consulta siempre que el valor calculado se puede representar en SQL. También puede utilizar annotations al modelo como la order_by plazo.

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

Las operaciones básicas como +, -, *, / y ** se pueden utilizar con F(). Además hay varias otras funciones tales como Count, Avg, Max, ...

Enlaces:

Ver también este SO Q & A: ordenar un QuerySet por valor de campo agregado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top