按ID的Django组然后选择最大时间戳

时间:2013-06-25 16:55:51

标签: python mysql django

这可能是一个多余的问题,但我已尝试过其他相关主题的先前答案,但仍然无法弄明白。

我有一个表Board_status看起来像这样(每个板的多个状态和时间戳):

time      | board_id | status
-------------------------------
2012-4-5  |        1 | good

2013-6-6  |        1 | not good

2013-6-7  |        1 | alright

2012-6-8  |        2 | good

2012-6-4  |        3 | good

2012-6-10 |        2 | good

现在我想从Board_status表中选择所有记录,通过board_id将所有记录分组为不同的board_id,然后在每个板上选择最新状态。基本上最终得到这样的表(只有每个板的最新状态和时间戳):

time      | board_id | status
------------------------------
2013-6-7  |        1 | alright

2012-6-4  |        3 | good

2012-6-10 |        2 | good

我试过了:

b = Board_status.objects.values('board_id').annotate(max=Max('time')).values_list('board_id','max','status')

但似乎不起作用。每个board_id仍然给我超过1条记录。

我应该在Django中使用哪个命令来执行此操作?

2 个答案:

答案 0 :(得分:1)

更新,这是我使用的解决方案。不是最好的,但它现在有效:

b=[]
a = Board_status.objects.values('board_id').distinct()
for i in range(a.count()):
 b.append(Board_status.objects.filter(board_id=a[i]['board_id']).latest('time'))

所以我得到了所有board_id,存入列表a。然后为每个board_id执行另一个查询以获取最新时间。任何更好的答案仍然受到欢迎。

答案 1 :(得分:0)

它将如何运作?您既没有过滤器也没有区别来过滤掉重复项。我不确定这是否可以在单个django查询中轻松完成。你应该阅读更多内容:

  1. https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
  2. https://docs.djangoproject.com/en/1.4/topics/db/aggregation/
  3. 如果你不能在1个原始sql查询中执行它,你不能使用OR映射器,因为它构建在mysql之上(在你的情况下)。你能告诉我你将如何通过原始SQL做到这一点吗?