gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:15:18 25 4
gpt4 key购买 nike

所以,我有这些模型:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com