Django ORM获取字段的最大值和相应的其他列值

2024-10-17 06:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

`exp_no`   'time'   'price'

^{pr2}$

相应的Django模型:

class StData(models.Model):
      exp_no = models.ForeignKey(StIndex, on_delete=models.CASCADE)
      time = models.DateTimeField()
      price = models.DecimalField(max_digits=10, decimal_places=2)   

我想做一个小一点的表,上面有exp_no,max_time和相应的价格,这样:

 `exp_no`   'time'   'price'

  1       15 days     100.0
  2       15 days     100.0

在熊猫身上,我会做df.groupby('exp_no')['time', 'price'].max().reset_index() 得到想要的桌子。在

在Django ORM注释中获取相同的结果(或Queryset),如果我这样做:

qs.values('exp_no').annotate(max_time=Max('time')).order_by()

它给了我经验和时间,但我也想得到相应的价格。我在SO:Django orm get latest for each group中看过这个答案

但不知道我是怎么得到这个价钱的。在sqlite3中使用Django 2.0。在

谢谢你的帮助。在


Tags: 数据djangono模型modeltimemodels价格
1条回答
网友
1楼 · 发布于 2024-10-17 06:28:32

您的问题归根结底是为具有最大time列的记录获取StData对象(或值)。因此,我们不需要聚合,而是获得相对于time列的最小或最大行。在

获取最大值为time的{}对象

当您在'time'上订购时,您只需获得last()行,如:

stdata_max_time = qs.order_by('time').last()  # will return a StData

或者选择:

^{pr2}$

如果time可为null(不在这里),您可以通过指定在排序时将这些元素分别作为第一个/最后一个元素来确保不会检索到带有NULL的行:

from django.db.models import F

# two alternatives
stdata_max_time = qs.order_by(F('time', nulls_first=True)).last()
stdata_max_time = qs.order_by(F('-time', nulls_last=True)).first()

因此,这是一个StData对象,因此您可以从该对象检索所有相关信息。因为它是一个StData对象,所以它的行为也会是这样的(因此,您定义的额外属性、方法等也会起作用)。在

获取最大值time

这完全类似,只是我们在查询中添加了.values(..)调用:

stdata_max_time = qs.order_by('time').values('exp_no', 'time', 'price').last()

但是除非有一些非常好的理由,否则我个人更倾向于获取StData对象,因为这意味着“包含电池”(您可以获得在StData类中使用该对象编写的所有逻辑)。在

相关问题 更多 >