como classificar por um valor calculado em django
-
06-09-2019 - |
Pergunta
Hey Eu quero objetos classificar com base em um valor calculado no Django ... como posso fazer isso?
Aqui é um modelo de perfil de exemplo usuário baseado em estouro de pilha que explica a minha situação:
class Profile(models.Model):
user = models.ForeignKey(User)
def get_reputation():
...
return reputation
reputation = property(get_reputation)
Então, digamos que eu quero classificar usuários por reputação. Como faço isso? Eu sei que você não pode simplesmente fazer isso:
Profile.objects.order_by("-reputation")
Obrigado por sua ajuda a todos:)
Solução
Se você precisa fazer a triagem no banco de dados (porque você tem muitos registros, e precisam, por exemplo paginate-los), a única opção real é transformar reputação em um campo desnormalizada (por exemplo, atualizado em um método save()
substituído em o modelo).
Outras dicas
Uma vez que existe o código de cálculo apenas dentro Python, você tem que executar a classificação em Python, assim:
sorted (Profile.objects.all (), key = lambda p: p.reputation)
A partir de Django-1.8, é possível classificar uma QuerySet usando expressões de consulta , desde que o valor calculado pode ser processado em SQL. Você também pode usar annotations
ao modelo como order_by
prazo.
from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")
As operações básicas como +
, -
, *
, /
e **
pode ser usado com F()
. Além disso, existem várias outras funções, como Count
, Avg
, Max
, ...
Links:
- Agregação -
order_by
- fazendo Consultas - filtros podem fazer referência a campos em um modelo
- Expressões de consulta - Construído em expressões
Veja também este SO Q & A: Encomendar um QuerySet pelo valor do campo agregado