【问题标题】:How to get records with last dates in Django ORM(MySQL)?如何在 Django ORM(MySQL)中获取最后日期的记录?
【发布时间】:2015-09-29 02:15:20
【问题描述】:

我有模型:

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)

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

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,但它不适用于通过引用过滤

【问题讨论】:

    标签: mysql django orm aggregation


    【解决方案1】:

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

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

    所以你的查询是

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

    【讨论】:

      【解决方案2】:

      我从某人那里实现了一个 sn-p,但我不记得用户也没有链接。 一点上下文:

      我有一个名为Medicion 的模型,其中包含一台机器的测量寄存器,机器是在Equipo 的模型实例中创建的,Medicion 实例除了Equipo 的外键外,还有一个外键Odometro,这个模型用作一种时钟或米,这就是为什么当我想为某台机器检索数据(测量值也就是Medicion 模型的实例)时,我还需要指出时钟,否则它会检索我很多杂乱无章的数据。

      这是我的实现:

      首先我检索最后的日期:

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

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

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

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

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

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

      resultados = Medicion.objects.filter(mega_query).filter(
              equipo=equipo,
              odometro__in=lista_odometros).order_by('odometro', 'fecha') # lista_odometros is a python list containing pks of another model, don't worry about it.
      

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 2013-07-27
        • 2014-03-10
        • 2018-06-14
        • 1970-01-01
        • 2020-11-07
        • 2015-02-05
        • 1970-01-01
        • 2023-04-07
        相关资源
        最近更新 更多