如何进行查询以获取Django ORM中每个组的最后一个元素?

时间:2018-11-01 05:35:24

标签: django django-models django-queryset django-orm django-database

我的Postgresql数据库中有一个Truck表。我每分钟写一次新数据。我想按序列获取每个组的最新元素。但是问题是我的数据库如此之大,查询需要很长时间。现在我有470000行数据。我尝试进行查询:

rec_ = Trucks.objects.filter(serial='tsr1801').distinct('serial').order_by('serial', '-id')

响应速度太慢。我尝试了如下所示的其他方法,但是这些查询的运行速度也很慢。

1)https://stackoverflow.com/a/19930802/7456750

我的:Trucks.objects.annotate(max_id=Max('id')).filter(id=F('max_id'))

2)https://stackoverflow.com/a/17887296/7456750

我的:Trucks.objects.values('serial', 'payload', 'datetime').annotate(id=Max('id'))

是否有任何方法可以获取每个组的最新元素,而这些元素可以快速运行?

+-----+-------------+------------+---------------------+
|  Id |   Serial    |  Payload   |     Datetime        |
+-----+-------------+------------+---------------------+
|  1  |   tsr1801   |   24432    | 2018-11-01 12:00:00 |
+-----+-------------+------------+---------------------+
|  2  |   tsr1802   |   20234    | 2018-11-01 12:01:00 |
+-----+-------------+------------+---------------------+
|  3  |   tsr1802   |   21234    | 2018-11-01 12:01:00 |
+-----+-------------+------------+---------------------+
|  4  |   tsr1801   |   24332    | 2018-11-01 12:02:00 |
+-----+-------------+------------+---------------------+
|  5  |   tsr1801   |   21532    | 2018-11-01 12:03:00 |
+-----+-------------+------------+---------------------+
|  6  |   tsr1802   |   19234    | 2018-11-01 12:02:00 |
+-----+-------------+------------+---------------------+
|  7  |   tsr1801   |   18040    | 2018-11-01 12:04:00 |
+-----+-------------+------------+---------------------+
|  9  |   tsr1801   |   27452    | 2018-11-01 12:05:00 |
+-----+-------------+------------+---------------------+

1 个答案:

答案 0 :(得分:0)

我认为您可以在此处使用latest。例如:

 Trucks.objects.filter(serial='tsr1801').latest('Datetime')  # as per table

更新

您遵循的解决方案已经是非常好的方案。即使您使用以下查询(例如您正在使用的查询):

 Truck.objects.distinct('serial').order_by('serial', '-Datetime')

应该足够快。

因此,除了更改查询之外,您应该在其他地方查找。像更新indexes of your DB一样,使用cache来减少数据库命中率等