2009-11-19 73 views
0

不知道如何短語問題,但在這裏。Django ORM,聚合?

假設我有一個事件表,並且每個事件都使用通用外鍵鏈接到一個對象。

我不想顯示鏈接到同一個外部對象的兩個事件,只顯示鏈接到同一個對象的最近事件。

任何人都可以提供任何提示嗎?

+0

你想顯示的事件列表或者是您是否在其他對象的詳細信息頁面上顯示最近的事件? – sheats 2009-11-19 13:45:38

+0

我想顯示一個事件列表。 – dan 2009-11-19 13:53:50

回答

0

當您使用外鍵指向模型時,指向的模型會獲取一個描述符,指向指向它的所有模型。在這種情況下,默認情況下爲modelname_setevent_set,除非您已更改它。

您可以使用此描述符獲取對象的最新事件。由於描述符返回一個查詢集合,所以您可以在日期字段中排序,並取第一個。

latest_event_for_obj = obj.entry_set.order_by('-your_date_field')[0] 
+0

對不起,我不清楚。根據我所描述的條件,我正在尋找一系列事件。 – dan 2009-11-19 13:54:47

2

我覺得這樣做可能很難做到你所要求的。既然您正在查找事件列表並使用泛型關係,您唯一的選擇可能是通過.extra()過濾器添加一些SQL。我不確定我甚至不知道你需要爲此運行哪些SQL,因爲它可能需要GROUP BY和HAVING子句。

作爲一種替代方案,考慮將BooleanField添加到名爲latest的事件對象中。然後在你的事件的保存方法,寫出像這樣的代碼:

def save(self, *args, **kwargs): 
    similar_events = Event.objects.filter(content_type=self.content_type, 
              object_id=self.object_id) 
    later_events = similar_events.filter(date__gt=self.date) 
    if later_events: 
     self.latest = False 
    else: 
     self.latest = True 
     similar_events.filter(date__lte=self.date).update(latest=False) 

    super(Event, self).save(*args, **kwargs) 

然後讓你的事件列表簡單地做到這一點:

Event.objects.filter(latest=True) 
+0

我喜歡這種感覺,但是實際上,它將查看事件列表(這將會發生很多事件)的成本轉移到事件的創建上,事件發生的頻率相對較低。 – dan 2009-11-19 14:33:59

+0

順便說一句,如果這是你決定和你一起去的答案,可以點擊支票將其標記爲接受的答案。 – sheats 2009-11-20 14:52:27