2009-05-30 6 views
5

ちょっと、私はdjangoの計算値に基づいてオブジェクトをソートしたいと思います...どうすればいいですか?ここでdjangoで計算された値でソートする方法

は私の苦境を説明し、スタックオーバーフローなどに基づくユーザプロファイルモデルである:だから

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

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

、私は評判でユーザーをソートしたいと言います。それ、どうやったら出来るの?私はあなただけでこれを行うことはできません知っている:あなたの助けみんなのため

Profile.objects.order_by("-reputation") 

感謝:)

答えて

3

あなたは(あなたがたくさんのレコードを持っており、それらをページ付け、たとえばする必要があるため)、データベース内のソートを行う必要がある場合、唯一の現実的な選択肢は、非正規化フィールドに評判を有効にすることです(例えば上書きsave()で更新モデル上のメソッド)。

+2

+1:単にこのフィールドを最新の状態にするためにsave()をオーバーライドします。 –

+0

私はsave()をオーバーライドするのではなく、保存後のシグナルを使うことにしました...そのアプローチについて知っておくべき潜在的な問題はありますか? – Jiaaro

+0

信号を使用する場合は、post_saveではなくpre_saveをお勧めします。 post_saveを使用して非正規化フィールドを最新の状態に保つには、2つのUPDATEクエリを実行するだけで十分です。 –

16

あなたの計算コードのみのPythonの中に存在しているので、あなたにもPythonで並べ替えを実行する必要があります。

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

ねえ、これは私が尋ねた質問に対する答えですが、私は問題を解決したので、他のものを受け入れました。具体的にはS.Lottのコメントです。私はあなたの答えをupmodded :) – Jiaaro

+0

これは、通常のpythonリスト(またはクエリセットにリストを変換する)の代わりにquerysetを返す方法はありますか? – Jiaaro

+0

コメントで尋ねるのが少し重苦しい​​ようですので、私はそれを自分の質問に移しました:http://stackoverflow.com/questions/1058135/django-convert-a-list-back-to-a-queryset – Jiaaro

5

Django-1.8では、計算された値をSQLでレンダリングできる限り、query expressionsを使用してQuerySetをソートすることができます。モデルにannotationsorder_byという用語として使用することもできます。 +-*/**などの

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

基本操作F()で使用することができます。

も参照してください。このSO Q:また、このようなCountAvgMax、...

リンクなど他のいくつかの機能があります&A:Order a QuerySet by aggregate field value

関連する問題