1

私は、PersonとRunningScoreを子として持つ単純な階層モデルを持っています。このモデルは、多くのユーザーのランニングスコアに関するデータを格納し、次のように簡略化されています。

class Person(models.Model):
   firstName = models.CharField(max_length=200)
   lastName = models.CharField(max_length=200)  

class RunningScore(models.Model):
   person = models.ForeignKey('Person', related_name="scores")
   time = models.DecimalField(max_digits=6, decimal_places=2)   

単一のPersonを取得すると、それに関連付けられたすべてのRunningScoreが付属します。これは標準の動作です。私の質問は本当に単純です。RunningScoreの子のみを持つPersonを取得したい場合(より良い結果、別名min(time)を想定)、どうすればよいですか?Djangoの公式ドキュメントを読みましたが、解決策が見つかりませんでした。

4

2 に答える 2

0

私はあなたが何を意味するのかを100%確信していませんが、おそらくこれは役立つでしょう:

from django.db.models import Min
Person.objects.annotate(min_running_time=Min('time'))

min_running_timeクエリセットは、追加の属性を持つPersonオブジェクトをフェッチします。

フィルタを追加することもできます。

Person.objects.annotate(min_running_time=Min('time')).filter(firstName__startswith='foo')

最初のオブジェクトのmin_running_time属性へのアクセス:

first_person = Person.objects.annotate(min_running_score=Min('time'))[0]
print first_person.min_running_time

編集:

次のようなメソッドまたはプロパティを定義して、関連するオブジェクトを取得できます。

class Person(models.Model):
...
    @property
    def best_runner(self):
        try:
            return self.runningscore_set.order_by('time')[0]
        except IndexError:
            return None
于 2011-06-05T15:59:36.733 に答える
0

1人のPersonに対して1つのRunningScoreが必要な場合は、oderingを使用して、クエリセットを1つのオブジェクトに制限できます。このようなもの:

Person.runningscore_set.order_by('-time')[0]

クエリセットの制限に関するドキュメントは次のとおりです。

https://docs.djangoproject.com/en/1.3/topics/db/queries/#limiting-querysets

于 2011-06-06T16:13:14.850 に答える