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

Django ORM: group records by a field and then get the records with max field value in each group

我有这样一个模型:

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},
   .
   .
   .
}

我可以用一个查询来完成吗?数据库比较大,对日期执行循环是行不通的。

您可以这样做以获得特定日期的最高价格

from django.db.models import Max

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

编辑:如果你想获得特定日期的最高价格的整个对象,你可以通过 OuterRefSubquery 实现,在 Django 1.11[=15= 中支持]

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.

阅读更多关于子查询的信息