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', blank=True, null=True)
bgp_routes = models.CharField(max_length=10, verbose_name='BGP Routes Received', blank=True, null=True)
service_status = models.CharField(max_length=10, verbose_name='Service Status', blank=True, null=True)  
timestamp = models.DateTimeField(auto_now=True, blank=True, null=True)  

使用(打印为dict(进行测试的示例数据,"device_circuit_subnet_id"应该只有一条记录:"10",即最新的记录。

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

我读到distinct用于此,但正在运行MySQL,有其他方法吗?

感谢

[{
"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,
"hostname": "EDGE",
"device_circuit_subnet_id" : "20",
"circuit_name": "MPLS 02",
"subnet": "172.2.1.1",
"subnet_mask": "/30",
"bgp_session": null,
"bgp_routes": null,
"bgp_peer_as": null,
"service_status": "unknown",
"timestamp": "2019-11-15 16:18:30"
},
{
"id": 9,
"hostname": "EDGE",
"device_circuit_subnet_id" : "10",
"circuit_name": "MPLS",
"subnet": "172.1.1.1",
"subnet_mask": "/30",
"bgp_session": "1w3d",
"bgp_routes": "385",
"bgp_peer_as": "1",
"service_status": "Up",
"timestamp": "2019-11-18 16:16:44"
}
]

感谢

你试过这个吗?


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(...)

我不确定这个查询的性能,但它会起作用:(:(

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]

相关内容

最新更新