Cómo ordenar por un valor computado en Django.

Hola, quiero ordenar los objetos según un valor computado en django … ¿cómo lo hago?

Aquí hay un ejemplo de modelo de perfil de usuario basado en el desbordamiento de stack que explica mi situación:

class Profile(models.Model): user = models.ForeignKey(User) def get_reputation(): ... return reputation reputation = property(get_reputation) 

Entonces, digamos que quiero ordenar a los usuarios por reputación. ¿Cómo puedo hacer eso? Sé que no puedes simplemente hacer esto:

 Profile.objects.order_by("-reputation") 

Gracias por su ayuda a todos 🙂

Si necesita hacer la clasificación en la base de datos (debido a que tiene muchos registros y necesita, por ejemplo, paginarlos), la única opción real es convertir la reputación en un campo desnormalizado (por ejemplo, actualizado en un método de save() anulado en la modelo).

Dado que su código de cálculo solo existe dentro de Python, también debe realizar la clasificación en Python:

 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 computado se pueda representar en SQL. También puede utilizar annotations al modelo como el término order_by .

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

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

Campo de golf:

  • Agregación – order_by
  • Realización de consultas: los filtros pueden hacer referencia a los campos de un modelo
  • Expresiones de consulta – Expresiones incorporadas

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