Django ORM:按字段对记录进行分组,然后获取每组中具有最大字段值的记录

时间:2017-09-14 05:57:06

标签: mysql django django-orm

我有一个这样的模型:

Class Foo(model.Models):
    date = models.DateField()
    price = models.FloatField()
    volume = models.IntegerField()

我想获得每天价格最高的所有物品的清单!像这样的东西:

{
   2017-01-01: {"date": 2017-01-01, "price": 1000, "volume": 210},
   2017-01-02: {"date": 2017-01-02, "price": 1032, "volumne": 242},
   .
   .
   .
}

我可以使用一个查询执行此操作吗?数据库相对较大,并且在日期上执行循环不起作用。

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作以获取特定日期的最高价格

from django.db.models import Max

Foo.objects.values('date').annotate(max_price=Max('price'))

编辑:如果您想获得具有特定日期最高价格的整个对象,您可以通过OuterRefSubquery实现这一目标,Django 1.11支持

from django.db.models import Max, Subquery, OuterRef

subquery = Foo.objects.filter(date=OuterRef('date')).order_by('-price')
queryset = Foo.objects.filter(price=Subquery(subquery.values('price')[:1]))

这将创建一个子查询,以获取具有给定日期的最大价格值的对象,然后通过此子查询过滤主查询集。您可以在Django docs了解有关子查询的更多信息。