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

但是,我想以某种方式注释一个人参加特定俱乐部的练习次数。

我更喜欢使用 django ORM 的东西,而不必求助于编写原始 SQL。

谢谢。

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、Ubuntu Karmic。

PS:为字段使用小写名称是一个好主意™。这使得使用双下划线 ( __) 语法链接字段变得更加容易。例如,在您的情况下,Django 会自动practicerecord为每个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 回答