django - 选择每个字段/列具有最大字段/列值的实例/行(分组依据)

标签 django django-orm

所以,我有这些模型:

class Computer(models.Model):
    hostname = models.CharField(primary_key=True, max_length=6)
    <other computer info fields>

class ComputerRecord(models.Model):
    id = models.AutoField(primary_key=True)
    pc = models.ForeignKey(Computer, on_delete=models.CASCADE)
    ts = models.DateTimeField(blank=False)
    <other computerrecord info fields>

我想为每个 pc(计算机模型)获取具有最大 ts 的行/计算机记录实例

在 sql 中是这样的:

SELECT hub_computerrecord.*
FROM hub_computerrecord
JOIN (
    SELECT pc_id, MAX(ts) AS max_ts
    FROM hub_computerrecord
    GROUP BY pc_id
) AS maxs ON hub_computerrecord.pc_id = maxs.pc_id
WHERE hub_computerrecord.ts = maxs.max_ts;

注意(编辑):有很多 ComputerRecord 实例(超过 10000 个),所以任何效率太低的东西都行不通

最佳答案

试试这个

from django.db.models import Max, F

qs = ComputerRecord.objects.annotate(
    max=Max('pc__computerrecord__ts')
).filter(
    ts=F('max')
)

是的,此表单表达式不会在 OP 中构建精确 SQL 查询,但会产生相同的结果(可能存在一些性能问题,不确定矩阵)

或者,您可以使用 raw() 方法执行原始 SQL,如下所示

raw_query = """
SELECT hub_computerrecord.*
FROM hub_computerrecord
JOIN (
    SELECT pc_id, MAX(ts) AS max_ts
    FROM hub_computerrecord
    GROUP BY pc_id
) AS maxs ON hub_computerrecord.pc_id = maxs.pc_id
WHERE hub_computerrecord.ts = maxs.max_ts;
"""

qs = ComputerRecord.objects<b>.raw(raw_query)</b>

关于django - 选择每个字段/列具有最大字段/列值的实例/行(分组依据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63567009/

相关文章:

django - 使用 Django 查询集获取每个组的前 n 条记录

mysql - Django - 查询精确的字符串匹配

python - Django 存储实际可用性并查询新预订的可用时间表

python - 使用 Django 实时显示数据

python - Django 中 choicefield 的 HTML 标签

python - Curl:HTTP/1.1 100 继续文件上传消息

django - 如何根据反向外键相关模型的字段过滤QuerySet?

python - 如何使用 Django ORM 通过相关对象查询模型并获取查询集中的相关对象

database - 在 Django 中,我无法保存模型的新内容

python - 覆盖 JWT,以便用户可以通过移动设备注册