Django - 获取每个外键 ID 的单个时间戳(MySQL)

标签 django django-rest-framework django-queryset

在下面的模型中,我无法为每个外键 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/

相关文章:

django - django 中的抽象形式或形式组合?

django - 在一个 View 中使用两个模板

django-rest-framework - 如何从序列化程序输出中动态删除字段

python - Django REST 框架对象级权限

python - Django对象查询集通过匹配日期时间过滤

python - 使用 values() 从 Django DateTimeField 获取年份

django - 优化 urls.py 的路径约定

Python/Django shell 无法启动

Django Rest Framework批量更新插入而不是更新

python - Django查询集过滤列表的最大值