【问题标题】:Django ORM: group records by a field and then get the records with max field value in each groupDjango ORM:按字段分组记录,然后获取每个组中具有最大字段值的记录
【发布时间】:2018-02-22 23:50:00
【问题描述】:

我有一个这样的模型:

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

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

【问题讨论】:

标签: mysql django django-orm


【解决方案1】:

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

from django.db.models import Max

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

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

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 阅读有关子查询的更多信息。

【讨论】:

  • 这仅返回最高价格。我想要价格最高的物品! (我也想要它的音量)
猜你喜欢
  • 2021-08-14
  • 2017-04-02
  • 2021-12-10
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多