在下面的模型中,我无法为每个外键 ID 获取一条记录,我已经尝试过此查询,但目前它似乎根本没有执行任何操作
我使用了有效的原始查询,但我无法对其使用过滤器。我还创建了一个列表并从查询集中删除了重复项,但我再次无法过滤它,因为它是一个列表
查询:
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)
示例数据正在测试(作为字典打印),“device_circ_subnet_id”应该只有一条记录:“10”,即最新的一条记录。
我想要每个 device_Circuit_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"
}
]
谢谢
最佳答案
你试过这个吗?
<b>from django.db.models import Max, F</b>
<b>max_timestamp = Max('device_circuit_subnet__bgpdata__timestamp')</b>
result = BGPData.objects.annotate(<b>ts=max_timestamp</b>).filter(<b>timestamp=F('ts')</b>).select_related(...)
我不确定此查询的性能,但它会起作用:) :)
关于Django - 获取每个外键 ID 的单个时间戳(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58919393/