Django 选择具有最大字段/列值的实例/行/具有字段/列的实例/行(分组依据)
所以,我有这些模型: 类别:计算机模型。模型: hostname=models.CharFieldprimary\u key=True,max\u length=6 类ComputerRecordmodels。模型: id=models.AutoFieldprimary\u key=True pc=models.ForeignKeyComputer,on_delete=models.CASCADE ts=models.DateTimeFieldblank=False 我想获取每个pc计算机型号的最大ts的行/计算机记录实例 在sql中,应该是这样的: 选择hub_computerrecord* 从hub_计算机记录 参加 选择pc\u id,最大值为最大值 从hub_计算机记录 按pc_id分组 作为集线器上的maxs\u computerrecord.pc\u id=maxs.pc\u id 其中hub_computerrecord.ts=maxs.max_ts; 注意编辑:有很多ComputerRecord实例超过10000个,所以任何效率太低的都不会起作用Django 选择具有最大字段/列值的实例/行/具有字段/列的实例/行(分组依据),django,django-orm,Django,Django Orm,所以,我有这些模型: 类别:计算机模型。模型: hostname=models.CharFieldprimary\u key=True,max\u length=6 类ComputerRecordmodels。模型: id=models.AutoFieldprimary\u key=True pc=models.ForeignKeyComputer,on_delete=models.CASCADE ts=models.DateTimeFieldblank=False 我想获取每个pc计算机型号的
from django.db.models import Max, F
qs = ComputerRecord.objects.annotate(
max=Max('pc__computerrecord__ts')
).filter(
ts=F('max')
)
是的,此表单表达式不会在OP中构建精确的SQL查询,但它会生成相同的结果—可能存在一些性能问题,不确定矩阵
或者,您可以使用raw方法执行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.raw(raw_query)
在ComputerRecord模型中添加一个布尔字段,例如max_status。用计算机对象的最大“ts”值标识记录,并将其设置为True。因此,如果您有一个特定计算机型号的10000条记录,那么在max_状态字段中,一条记录将为True,其余9999条记录将为False。每个计算机型号只需执行一次 下次在ComputerRecord模型中添加新行时,只需将新记录的“ts”与现有记录的“ts”进行比较,最大状态值为True。如果新记录具有更高的“ts”值,则将此记录的max_状态设置为True,并将以前记录的max_状态更改为False,否则无需更改
当您需要查找具有max'ts'的ComputerRecord实例时,只查询max_status=True效率非常低,因为我有很多ComputerRecord是的,是的。但是,顺便说一句,Django ORM没有获得SQL查询的灵活性。顺便说一句,您想使用原始SQL查询来获取对象吗?如果我使用原始SQL,它会限制一系列其他功能,如django orm筛选器、url筛选器、自定义筛选器等…正如我所提到的,django orm没有足够的灵活性来获取SQL查询这是一个很好的解决方案,如果您在ComputerRecord模型中具有较低的POST/INSERT,事实并非如此。对于每一篇文章,我都必须更新电脑的最后一条记录,然后创建一个新行。不过,我会将效率与其他解决方案进行比较。非常感谢。