Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Queryset-获取每个外键的最新记录_Django_Python 3.x_Django Queryset - Fatal编程技术网

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

Django Queryset-获取每个外键的最新记录,django,python-3.x,django-queryset,Django,Python 3.x,Django Queryset,我在网上看到了很多类似的问题,但似乎没有一个对我所追求的有用 我有一张这样的桌子: 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

我在网上看到了很多类似的问题,但似乎没有一个对我所追求的有用

我有一张这样的桌子:

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
试试这个:


BGPData.objects.filter(timestamp=max(timestamp)).distinct(subnet_id)
一种方法,使用
.values()
子网进行分组,然后使用最大时间戳进行注释:

from django.db.models import Max

BGPData.objects.values('subnet').annotate(timestamp=Max('timestamp'))
使用此方法的缺点是,结果是一个字典列表,其中只包含指定字段的字段键/值。如果这些字段是您要查找的唯一字段,则这不是问题

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

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 ORM术语表示的SQL查询等效:

按具有max(时间戳)的子网id从bgpdata组中选择*;
这个查询非常优雅且易于理解,但在Django ORM中似乎没有明显的方法来实现这样的查询。一般来说,您可以编写子查询来检索所有需要的列,如下所示:

from django.db.models import Max

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

很难理解你在寻找什么。是否要使用
BGPData
模型中的最新时间戳对
Subnet
对象进行注释?抱歉,我正在从bgpdata表中查找每个子网id的最新记录我添加了示例数据以帮助清理它这个组是如何通过
子网的
?好的,我不确定我现在如何处理实时数据,返回两个结果?如何获取模型其他字段此查询结果,如带有外键和日期的路由?