Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 选择具有最大字段/列值的实例/行/具有字段/列的实例/行(分组依据)_Django_Django Orm - Fatal编程技术网

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

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计算机型号的

所以,我有这些模型:

类别:计算机模型。模型: 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个,所以任何效率太低的都不会起作用

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,事实并非如此。对于每一篇文章,我都必须更新电脑的最后一条记录,然后创建一个新行。不过,我会将效率与其他解决方案进行比较。非常感谢。