2011-06-05 81 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