如何在Django ORM(MySQL)中获取具有上次日期的记录?

时间:2015-07-10 10:50:03

标签: mysql django orm aggregation

我有模特:

class Reference(models.Model):
    name = models.CharField(max_length=50)

class Search(models.Model):
    reference = models.ForeignKey(Reference)
    update_time = models.DateTimeField(auto_now_add=True)

我有一个Reference实例,我需要获取所有最后的搜索参考。现在我这样做:

record = Search.objects.filter(reference=reference)\
    .aggregate(max_date=Max('update_time'))
if record:
    update_time = record['max_date']
    searches = reference.search_set.filter(update_time=self.update_time)

除了一个查询之外,使用2个查询并不是什么大问题,但如果我需要在页面上获得每个引用的最后搜索,该怎么办?我会得到2x(引用计数)查询,但这不会很好。

我尝试使用此解决方案https://stackoverflow.com/a/9838438/293962,但它不适用于按引用过滤

2 个答案:

答案 0 :(得分:0)

我在gist中实现了一个片段,但我不记得用户没有链接。 一点背景:

我有一个名为Medicion的模型,其中包含机器测量的寄存器,机器是在Equipo的模型实例中创建的,Medicion实例除了{{1}的外键之外还有},Equipo的外键,这个模型作为一种时钟或仪表,这就是为什么当我想为某台机器检索数据(测量又称Odometro模型的实例)时,我需要也可以指示时钟,否则它会检索到很多混乱且难以理解的数据。

这是我的实施:

首先我检索最后的日期:

Medicion

然后我实例化一个Q对象:

ult_fechas_reg = Medicion.objects.values('odometro').annotate(max_fecha=Max('fecha')).order_by()

然后循环查询集(注释)中检索到的每个日期并建立Q语句:

mega_statement = Q() # This works as 'AND' Sql Statement

最后将这个mega语句传递给查询集,该查询集试图检索由两个字段过滤的模型的最后一条记录:

for r in ult_fechas_reg:
        mega_statement |= (Q(odometro__exact=r['odometro']) & Q(fecha=r['max_fecha']))

答案 1 :(得分:-1)

您可能想要使用最新的方法。 从文档中,“按日期,使用作为日期字段提供的field_name返回表中的最新对象。”

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#latest

所以你的查询将是

Search.objects.filter(reference=reference).latest('update_time')