django按字段的最大值选择行

时间:2017-02-10 16:02:26

标签: django django-queryset

我在django有一张桌子:

class Observation:
    plant = model.ForeignKey
    Trait = model.ForeignKey
    value = model.CharField
    creation_time = model.DateTimeField

我想进行查询以仅获取具有唯一植物/特征组合的最新行。例如:

row1 plant1 trait1 value1 dateyesterday
row2 plant1 trait1 value3 datetoday
row3 plant1 trait2 value1 datetoday

查询应该只返回row2和row3

我已经在SQL中解决了它:

SELECT * FROM vavilov_observation AS o
WHERE o.creation_time = (SELECT MAX(creation_time)
                         FROM vavilov_observation AS o2
                         WHERE o.plant_id=o2.plant_id AND o.trait_id=o2.trait_id)

有人可以帮我将这个SQL转换为django查询集吗?

到目前为止我找到的唯一解决方案是使用此sql创建一个原始查询集以获取pks并在Observations.objects.filter(observation_id__in = rawquery_ids)查询中使用它们。

此方法扩展性不佳。在其中一个数据库中,我有500.000行,在生产中使用时间太长。

任何帮助?

提前致谢 佩伊奥

1 个答案:

答案 0 :(得分:0)

这样的东西?

from datetime import datetime
now = datetime.now()
variable = observation.objects.filter(creation_time__gt=now).values('plant', 'trait', 'creation_time')