我有一个包含大量数据的表格.此表是由一些脚本编写的.它的工作方式类似于"签到",每个代理都在一段时间内签到.它看起来如下所示.

id agent status timestamp
1 tom ok 2023-03-16 12:27:03
2 jeff degraded 2023-08-31 00:01:13
100 tom ok 2023-10-03 12:00:00
101 jeff ok 2023-10-03 11:59:00

我想 for each 代理商挑选最 fresh 的产品.所以在上面的例子中,我希望得到第100行和第101行.

我试了很多不同的方法,但还是没有得到我想要的.我用的是MySQL,所以这次不适合我. 一方面,有一种方法可以使每个代理具有不同的值,如下所示:

AgentCheckin.objects.all().values('agent').distinct()

但这只是一个特工的名字.我需要获得包含所有信息的整个查询集. 我认为这种用例应该在多个Web应用程序中很常见,但这里的情况是这样的,这与最终答案并不常见.

模型:

class AgentCheckin(models.Model):
    agent = models.CharField(max_length=32)
    agent_version = models.CharField(max_length=16)
    status = models.CharField(max_length=16)
    log = models.TextField(blank=True)
    host = models.CharField(max_length=64)
    timestamp = models.DateTimeField(default=timezone.now)

推荐答案

适用于任何数据库的内容如下:

from django.db.models import Exists, OuterRef

AgentCheckin.objects.filter(
    ~Exists(
        AgentCheckin.objects.filter(
            agent=OuterRef('agent'), timestamp__gt=OuterRef('timestamp')
        )
    )
)

因此,如果存在具有相同agent和更新的时间戳的AgentCheckin,则我们过滤出AgentCheckin.

Django相关问答推荐

如何根据递归ManyToManyField值创建Django查询集?

如何在Django REST框架中使用FactoryBoy创建不同的项目

我无法在Django模板中使用Get_Foo_Display

如何在Django REST框架中管理序列化程序?

Django ImproperlyConfigured: AUTH_USER_MODEL指向尚未安装的模型'users.User'

Django 按月分组并按月显示在模板中

在 Django 4.1 中提交表单之前显示数据

Django:使用相同的外键在不同的应用程序中 Select 多个列

为什么在 Docker 映像中运行我的 Django 应用程序后下载属性不再起作用?

测试 Django ModelForm 是否有实例

无效的命令 WSGIDaemonProcess 在 CentOS 6.7 上部署 Django 应用程序

Django-获取外键模型

从 virtualenv 中,pip freeze > requirements.txt 给出了一堆垃圾!如何修剪它?

Django - 来自 QuerySet 的唯一列表

在 Django 中舍入小数点

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

模型表格Save保存,Get获取保存的对象

Django:在还原(迁移)后try 访问数据库时权限被拒绝

UpdateView 中的success_url,基于传递的值

1 个 django 应用程序中约有 20 个模型