2009-11-19 82 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