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:)

Foi útil?

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:

Veja também este SO Q & A: Encomendar um QuerySet pelo valor do campo agregado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top