我有模特:
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,但它不适用于按引用过滤
答案 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')