2013-06-25 71 views
1

这可能是一个多余的问题,但我已经尝试从其他相关主题的以前的答案,但还是无法弄明白。Django的GROUP BY ID,然后选择最大时间戳

我有一个表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中使用哪个命令来执行此操作?

回答

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,执行另一个查询以获取最新时间。任何更好的答案仍然受到欢迎。

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/

如果不能在1个原始的SQL查询做到这一点,你不能用一个OR映射器做到这一点无论是作为它的建成在MySQL的顶部(在你的情况)。你能告诉我你将如何通过原始SQL做到这一点?

+0

我认为你是对的。我一直试图在原始SQL中执行它,但也无法在1个查询中获得它。我正在考虑将所有board_id读入数组,然后从该数组到数据库执行for循环以获取最新记录。如果我的桌子变大了,会很麻烦... – Linh