120

オブジェクトのリストがありますが、クエリを実行してフィールドの最大値を取得する方法は次のとおりです。

私はこのコードを使用しています:

def get_best_argument(self):
    try:
        arg = self.argument_set.order_by('-rating')[0].details
    except IndexError:
        return 'no posts'
    return arg

評価は整数です

4

6 に答える 6

211

これを参照してください。コードは次のようになります。

from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}

これは、既存のクエリセットでも使用できます。

from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}

この最大値を含むモデルインスタンスが必要な場合は、投稿したコードがおそらくそれを行うための最良の方法です。

arg = args.order_by('-rating')[0]

クエリセットが空の場合、つまりクエリに一致する引数がない場合、これはエラーになることに注意してください([0]パーツがを発生させるためIndexError)。その動作を回避し、代わりにその場合に戻る場合は、次Noneを使用します.first()

arg = args.order_by('-rating').first() # may return None
于 2009-05-10T03:14:39.073 に答える
85

Django には、最新 (最大値) のエントリを見つける' latest(field_name = None) ' 関数もあります。日付フィールドだけでなく、文字列や整数でも機能します。

その関数を呼び出すときにフィールド名を指定できます。

max_rated_entry = YourModel.objects.latest('rating')
return max_rated_entry.details

または、モデルのメタデータでそのフィールド名をすでに指定できます。

from django.db import models

class YourModel(models.Model):
    #your class definition
    class Meta:
        get_latest_by = 'rating'

これで、パラメーターなしで「latest()」を呼び出すことができます。

max_rated_entry = YourModel.objects.latest()
return max_rated_entry.details
于 2013-06-14T08:07:20.127 に答える
52

私は自分のプロジェクトでこれをテストしました、それはO(n)時間で最大/最小を見つけます:

from django.db.models import Max

# Find the maximum value of the rating and then get the record with that rating. 
# Notice the double underscores in rating__max
max_rating = App.objects.aggregate(Max('rating'))['rating__max']
return App.objects.get(rating=max_rating)

これにより、テーブル全体を並べ替えて最上位(O(n * logn)付近)を取得するのではなく、最大の要素の1つを効率的に取得できることが保証されます。

于 2012-06-21T10:53:33.077 に答える