1

関連アイテムのサブセットの数でクエリセットに注釈を付ける方法を探しています。以下は私のモデルのサブセットです:

class Person(models.Model):
    Name = models.CharField(max_length = 255)
    PracticeAttended = models.ManyToManyField('Practice',
                                              through = 'PracticeRecord')

class Club(models.Model):
    Name = models.CharField(max_length = 255)
    Slug = models.SlugField()
    Members = models.ManyToManyField('Person')

class PracticeRecord(PersonRecord):
    Person = models.ForeignKey(Person)
    Practice = models.ForeignKey(Practice)

class Practice(models.Model):
    Club = models.ForeignKey(Club, default = None, null = True)
    Date = models.DateField()

人が参加したクラブ固有の練習の数に注釈を付けるクエリセットを作成しようとしています。のクエリで、その人の総練習回数をすでに見つけることができますPerson.objects.all().annotate(Count('PracticeRecord'))

しかし、ある人が特定のクラブに参加する練習の回数に注釈を付けたいと思います。

生のSQLを書くことに頼ることなく、django ORMを使用するものを好むでしょう。

ありがとう。

4

2 に答える 2

2

しかし、私はどういうわけか、特定のクラブのために人が参加する練習の数に注釈を付けたいと思います。

見てみましょう。

まず、特定のクラブを見つけます。

club = Club.objects.get(**conditions)

次に、このクラブで練習したすべての人をフィルタリングします。

persons = Person.objects.filter(practicerecord__Practice__Club = club)

次に、カウントで注釈を付けます。

q = persons.annotate(count = Count('practicerecord'))

編集

テストセットアップでこれを正常に機能させることができました:Django 1.2.3、Python 2.6.4、Postgresql 8.4、UbuntuKarmic。

PS:フィールドに小文字の名前を使用するのはGoodIdea™です。これにより、__フィールドをチェーンするために二重アンダースコア()構文を使用することがはるかに簡単になります。たとえば、あなたの場合、Djangopracticerecordはそれぞれに対して自動的に作成しますPerson。このフィールドを介しての他のフィールドにアクセスしようとするときは、PracticeRecordタイトルケースを使用することを忘れないでください。

小文字の名前を使用していた場合は、次のように書くことができます。

persons = Person.objects.filter(practicerecord__practice__club = club)
#                                               ^^        ^^  

これははるかに均一に見えます。

PPS:そうですCount('practicerecord')(小文字に注意してください)。

于 2010-10-11T06:16:49.223 に答える
0

残念ながら、ここでは生の SQL しか選択肢がありません。とにかく、モデルマネージャーに任せれば、それほど怖くて管理しにくいものではありません。

于 2010-10-11T07:38:30.023 に答える