是的,这两个查询是等价的。第一个查询使用了'output_field'参数来明确指定浮点数类型,而第二个查询使用了表达式'F()'来访问模型字段。但是,它们都执行了相同的聚合操作并按照相同的方式对结果进行排序。

第一个查询:

result = SimpleHashMapModel.objects.values('thread').annotate(sum=(Avg('count', output_field=FloatField()) / Avg('size', output_field=FloatField()) * Avg('number', output_field=FloatField()))).order_by('-sum')

第二个查询:

result = SimpleHashMapModel.objects.values('thread').annotate(sum=Avg(F('count')/F('size')*F('number'))).order_by('sum')

区别:

  • 第一个查询使用了'output_field'参数来明确指定每个平均值的类型为浮点数。
  • 第二个查询使用了'F()'表达式来访问模型字段,并将它们直接用于计算。

等价性:

这两个查询最终都计算了countsizenumber字段的平均值,并将它们相乘,最终得到一个浮点数类型的sum值,并按照sum值进行排序。因此,这两个查询是等价的。

选择方法:

您可以根据自己的代码风格和可读性选择其中一种方法。如果需要明确指定数据类型,可以使用第一种方法。如果希望代码更简洁,可以使用第二种方法。

Django ORM聚合查询:使用Avg()和F()实现平均值计算的等价方法

原文地址: https://www.cveoy.top/t/topic/nuGg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录