所以我想从数据库中获取值列表的最新结果。
示例:
Task
col1 col2
1 1
2 12
3 32
4 1
5 24
1 25
2 62
3 7
2 81
1 9 -> last occurence for '1' in 'col1'
4 10 -> last occurence for '4' in 'col1'
3 121
5 12 -> last occurence for '5' in 'col1'
有一个列表' z'我想用这样的方式编写查询,以便从表格中获得最新结果'任务'这样z就存在于col1中。假设' z'是:
z = [1, 4, 5]
我希望最终结果为:
col1 col2
1 9
4 10
5 12
我想出了两种解决方案。 Solution1如下:
all_results = Task.objects.filter(col1__in=z)
results = dict()
for result in results:
results[result.col1] = result
Solution2如下:
results = dict()
for x in z:
results[x] = Task.objects.filter(col1=x).reverse()[0]
但我想知道是否有办法将两种解决方案结合在一起,这样我只需要进行一次数据库调用,并获得每个不同的col1'的结果。 原因:我的数据库非常大,目前我已经实施了Solution2,这使得整个过程非常缓慢。 Solution1不可行,因为有多个条目和'结果'字典会非常大,因此非常耗费时间。
答案 0 :(得分:0)
您可以在QuerySet中实现此结果。您的ORM查询将是:
Task.objects.filter(col1__in=z).values('col1').annotate(latest_record=Max('col2'))
# where z = [1, 4, 5]