Django模型聚合

时间:2011-06-05 14:20:58

标签: django django-models django-aggregation

我有一个简单的分层模型,一个是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)   

如果我得到一个人,它会附带与之关联的所有RunningScores,这是标准行为。我的问题很简单:如果我想让一个只有一个RunningScore孩子的人(假设结果更好,也就是min(时间))我该怎么办? 我阅读了官方Django文档,但没有找到 溶液

2 个答案:

答案 0 :(得分:0)

如果我明白你的意思,我不是百分百肯定,但也许这会有所帮助:

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

答案 1 :(得分:0)

如果您只想为一个Person创建一个RunningScore,则可以使用odering并将查询集限制为1个对象。 像这样:

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

以下是限制查询集的文档:

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