所以,我有这些模型:
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/