2010-07-05 74 views
1

我有一个模型,它看起来像这样:聚集和额外的价值和Django

class MyModel(models.Model) 
    value = models.DecimalField() 
    date = models.DatetimeField() 

我在做这个请求:

MyModel.objects.aggregate(Min("value")) 

,我得到预期的结果:

{"mymodel__min": the_actual_minimum_value} 

但是,我不能找出一种方法来同时获得最小值和相关的日期(mi发生最小值)。

Django ORM是否允许这样做,还是我必须使用原始SQL?

回答

2

你想要做的是注释查询,这样你就可以恢复通常的结果,但也会将一些数据添加到结果中。所以:

MyModel.objects.annotate(Min("value")) 

将与mymodel__min返回正常的结果作为附加价值

在回答您的意见,我觉得这是你在找什么?这将以相应的最小值返回日期。

MyModel.objects.values('date').annotate(Min("value")) 

编辑:在进一步回答您的评论你想要的最低值入境,但也希望你的结果中附加日期字段,你可以不喜欢这样:

MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0] 

这将通过对结果进行排序得到最终的字典,然后简单地将第一个索引始终作为最低值。 见more

+0

纠正我,如果我错了,但: 与注释,该查询集将返回我所有的模型实例,每个实例的“mymodel__min”属性。 它不会告诉我在哪一天发生的最小值(除非手动比较,对于每个返回的价格,将值设置为最小值并选择匹配的日期)。 – Jeremy 2010-07-05 20:13:36

+0

你是对的。对不起,我没有意识到这也是你问题的一部分。我调整了我的问题,所以你可以按日期分组,这似乎是你想要的,是的? – Bartek 2010-07-05 20:18:35

+0

使用'annotate'将返回所有MyModel实例。我只对其值为最小值的实例感兴趣,并获得它的日期。 随着你的新请求,我得到一个列表,每个列表都有不同的日期和不同的最小值(实际上对应于每个模型实例中的值和日期)。 – Jeremy 2010-07-05 20:37:45