Django-每个外键ID(MySQL)获得一个时间戳

在下面的模型中,每个外键ID只能获取一条记录时遇到了麻烦,我已经尝试过该查询,但是目前看来它什么都没做

我使用了有效的RAW查询,但无法对其使用过滤器。香港专业教育学院还创建了一个列表,并从QuerySet中删除了重复项,但我再次无法对其进行过滤,因为它是一个列表

查询:

queryset = BGPData.objects.annotate(max_timestamp=Max('timestamp')).filter(timestamp=F('max_timestamp')).select_related(
    'device_circuit_subnet__subnet','device_circuit_subnet__device','device_circuit_subnet__circuit','device_circuit_subnet__device__site',)

型号:

class BGPData(models.Model):
    device_circuit_subnet = models.ForeignKey(DeviceCircuitSubnets,verbose_name="Device",on_delete=models.CASCADE)
    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',null=True)
    bgp_routes = models.CharField(max_length=10,verbose_name='BGP Routes Received',null=True)
    service_status = models.CharField(max_length=10,verbose_name='Service Status',null=True)  
    timestamp = models.DateTimeField(auto_now=True,null=True)  

使用im进行示例数据测试(以dict形式打印),“ device_circuit_subnet_id”应该只有一个记录:“ 10”,这是最新的记录。

我想要每个device_circuit_subnet_id的最新记录,因此查询应返回3个结果而不是4个结果,因为有2个项目具有相同的device_circuit_subnet_id。

为此使用了与众不同但正在运行MySQL的ive阅读,还有另一种方法吗?

谢谢

[{
        "id": 4,"device_circuit_subnet_id" : "10","hostname": "EDGE","circuit_name": "MPLS","subnet": "172.1.1.1","subnet_mask": "/30","bgp_session": "1w2d","bgp_routes": "377","bgp_peer_as": "1","service_status": "Up","timestamp": "2019-11-18 16:16:17"
    },{
        "id": 5,"device_circuit_subnet_id" : "11","hostname": "INT-GW","subnet": "1.1.1.1","subnet_mask": "/24","bgp_session": null,"bgp_routes": null,"bgp_peer_as": null,"service_status": "unknown","timestamp": "2019-08-07 14:46:00"
    },{
        "id": 8,"device_circuit_subnet_id" : "20","circuit_name": "MPLS 02","subnet": "172.2.1.1","timestamp": "2019-11-15 16:18:30"
    },{
        "id": 9,"bgp_session": "1w3d","bgp_routes": "385","timestamp": "2019-11-18 16:16:44"
    }
]

谢谢

hzthzjln 回答:Django-每个外键ID(MySQL)获得一个时间戳

Django查询集以惰性方式求值。这样,此查询将仅从数据库中获取一条记录。由于-前缀,时间戳的顺序是降序,因此最新的时间戳值将是第一条记录。

queryset = BGPData.objects.all().order_by(
    #prefix field name to order by with `-` to use Descending order
    '-timestamp'
).select_related(
    'device_circuit_subnet__subnet','device_circuit_subnet__device','device_circuit_subnet__circuit','device_circuit_subnet__device__site',)[0]
,

您尝试过吗?


from django.db.models import Max,F

max_timestamp = Max('device_circuit_subnet__bgpdata__timestamp')
result = BGPData.objects.annotate(ts=max_timestamp).filter(timestamp=F('ts')).select_related(...)

我不确定此查询的 性能 ,但是它可以正常工作:):)

本文链接:https://www.f2er.com/3079224.html

大家都在问