如何在django中过滤以获取每个日期的最新记录

vawmfj5a  于 2023-11-20  发布在  Go
关注(0)|答案(2)|浏览(122)

例如
记录表

id  value  created_datetime
1   10     2022-01-18 10:00:00
2   11     2022-01-18 10:15:00
3   8      2022-01-18 15:15:00
4   25     2022-01-19 09:00:00
5   16     2022-01-19 12:00:00
6   9      2022-01-20 11:00:00

字符串
我想过滤此表“记录表”,以获取每个日期的最新值。例如,有三个日期2022- 01- 18,2022 -01- 19,2022 -01-20,其中这些日期的最新值如下

Latest value of each dates are (Result that iam looking to get)
id  value  created_datetime
3   8      2022-01-18 15:15:00
5   16     2022-01-19 12:00:00
6   9      2022-01-20 11:00:00


那么,如何过滤以接收如上表所述的结果

6ljaweal

6ljaweal1#

它可以通过两个步骤完成:
首先获取每一天的最新日期时间,然后以此过滤记录。

max_daily_date_times = Record.objects.extra(select={'day': 'date( created_datetime )'}).values('day') \
        .annotate(latest_datetime=Max('created_datetime'))
records = Record.objects.filter(
        created_datetime__in=[entry["latest_datetime"] for entry in max_daily_date_times]).values("id", "value",
                                                                                                  "created_datetime")

字符串

x0fgdtte

x0fgdtte2#

我做了类似的事情,灵感来自@ Josewells的答案,似乎在我的用例中工作,但还没有进行战斗测试。
在我的例子中,ids_query将不包含那么多项,因为应用程序将在大约8个月后退役,所以我不关心它是一个奇怪的大数据集。

ids_query = model.objects.all().annotate(
    day=TruncDay('created')
).values('day').annotate(
    last_id=Max('id'),
)

statuses = model.objects.filter(
    id__in=[x['last_id'] for x in ids_query]
).order_by(
    'created'
)

字符串

相关问题