gpt4 book ai didi

Django Queryset - 获取每个外键的最新记录

转载 作者:行者123 更新时间:2023-12-04 10:44:10 25 4
gpt4 key购买 nike

我看到很多类似的查询,但似乎没有一个能满足我的需求,

我有一个这样的表:

class BGPData(models.Model):
subnet = models.ForeignKey(Subnet, verbose_name="Subnet", on_delete=models.CASCADE, blank=True, null=True)
bgp_peer_as = models.CharField(max_length=20, verbose_name='BGP Peer AS', blank=True, null=True)
bgp_session = models.CharField(max_length=10, verbose_name='BGP Session', blank=True, null=True)
bgp_routes = models.CharField(max_length=10, verbose_name='BGP Routes Received', blank=True, null=True)
timestamp = models.DateTimeField(auto_now=True, blank=True, null=True)

目标:我只想获取子网上每个外键的最新记录。

到目前为止的尝试如下:-

bgp_data_query = BGPData.objects.filter(subnet__get_bgp=True,subnet__wb_bgp=True) \
.annotate(last_updated=Cast(TruncSecond('timestamp', DateTimeField()), CharField()))

d = BGPData.objects.annotate(max_timestamp=Max('timestamp')).filter(timestamp=F('max_timestamp'))

有些东西我不太明白,但我不确定它是什么......

谢谢

所以如果我的表包含:

subnet_id | routes | timestamp
1 | 10 | 01-01-20 17:30
1 | 10 | 01-01-20 17:20
1 | 10 | 01-01-20 17:10
2 | 20 | 01-01-20 17:30

我会回来

subnet_id | routes | timestamp
1 | 10 | 01-01-20 17:30
2 | 20 | 01-01-20 17:30

最佳答案

在使用最大时间戳进行注释之前,使用 .values()Subnet 进行分组的一种方法:

from django.db.models import Max

BGPData.objects.values('subnet').annotate(timestamp=Max('timestamp'))

使用此方法的缺点是结果是一个字典列表,其中仅包含您指定的字段的字段键/值。如果这些字段是您要查找的唯一字段,那么这不是问题。

如果您需要访问 BGPData 模型或相关模型中的更多字段,那么您可以使用 Window function 。不幸的是,当我完成此操作时,我意识到过滤器中不允许使用窗口函数,因此这不能作为解决方案。

from django.db.models import F, Max, Window

data = (
BGPData.objects
.annotate(
max_timestamp=Window(
expression=Max('timestamp'),
partition_by=[F('subnet')],
order_by=F('timestamp').desc(),
)
)
# .filter(timestamp=F('max_timestamp')
)

关于Django Queryset - 获取每个外键的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com