Django ORM为每个组获取最新项目

时间:2019-05-25 01:08:12

标签: python django orm

我正在将Django 2.2.1与MariaDB 10.3.15一起使用。

我有这个模型:

class Hose(models.Model):
    description = models.CharField(blank=True, max_length=250)
    number = models.IntegerField(unique=True)

class HoseHistory(models.Model):
    class Meta:
        unique_together = (("date", "hose", "hose_event"),)

    date = models.DateTimeField()
    description = models.CharField(blank=True, max_length=250)
    hose = models.ForeignKey(Hose, on_delete=models.CASCADE)
    hose_event = models.ForeignKey(HoseEvent, on_delete=models.CASCADE)

现在,我想获得软管表的所有条目的列表,如果有的话,还有最新的HoseHistory行。

结果集应如下所示:

| Hose.description | Hose.number | HoseHistory.date | HoseHistory.description |
===============================================================================
|    Example A     |      1      |    2019-01-09    |         Event A         |
|    Example B     |      2      |       NULL       |          NULL           |

因此,详细而言,Django应该创建一个SQL查询,该查询选择Tabele Hose,左联接表HoseHistory,然后按Hose.number分组,然后按HoseHistory.date的所有MAX分组。

我尝试例如:

Hose.objects.values("number").annotate(max_date=Max("hosehistory__date")).order_by("hosehistory__date")

但是问题是,采用这种策略,我只有max_datenumber列,如果我添加更多的列,这些列将被添加到GROUP BY语句中,而该查询不会工作。

1 个答案:

答案 0 :(得分:0)

您可以在模型中添加方法

def latest_history(self):
    return HoseHistory.objects.filter(hose=self).order_by('-date').first()

并调用您的模板:{{ hose.latest_history }}(如果存在最新历史记录)