2011-06-05 91 views
1

我有一个简单的层次模型白人Person和RunningScore作为孩子。 有关运行多用户的得分这个模型存储数据,简化类似:Django模型聚合

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文档,但没有找到 解决方案。

回答

0

我不是100%肯定,如果我得到你的意思,但也许这将帮助:

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

的查询集将提取人与min_running_time附加属性的对象。

还可以添加一个过滤器:

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 
+0

是的,你的解决方案是正确的,如果我只需要最佳运行时间,但我需要整个子对象不仅是“时间”领域。 – Fabrizio 2011-06-06 08:30:09

+0

请参阅我的编辑。 – shanyu 2011-06-06 16:01:43

+0

您的解决方案是我正在寻找。我做了一些修改:def best_runner(self): – Fabrizio 2011-06-07 14:39:40