【问题标题】:Fetch latest related objects in django在 django 中获取最新的相关对象
【发布时间】:2013-08-15 09:26:29
【问题描述】:

在我的 django 应用程序中,我有“文档”。每个文档都有一个或多个按创建日期排序的“修订”。我想要一种方法来获取每个文档的最新版本。到目前为止我最好的是下面的代码,但我认为必须有一种方法可以用更少的数据库查询来做到这一点?

def get_document_templates():
    result = []
    for d in Document.objects.filter(is_template=True).all():
        result.append(d.documentrevision_set.latest())
    return result

我一直在研究“注释”和“聚合”过滤器,但不知道如何更有效地执行此操作。我宁愿不接触原始 SQL,因为数据库后端可能会在不久的将来发生变化。有人有什么想法吗?

谢谢!!

【问题讨论】:

标签: python django orm


【解决方案1】:

我认为有两种方法。有人解释了这篇博文"Getting the related item in an aggregate"。这将为每个 Document 提供附加的“修订”(如果您需要访问两者)。

如果您只想要Revision,您可以尝试使用values() 方法。与聚合一起使用时,它的功能会发生微妙的变化:

与 filter() 子句一样,annotate() 和 values() 子句应用于查询的顺序很重要。如果 values() 子句在 annotate() 之前,注释将使用 values() 子句描述的分组计算。

但是,如果 annotate() 子句在 values() 子句之前,则将在整个查询集上生成注释。在这种情况下,values() 子句仅限制在输出时生成的字段。

所以你可以通过DocumentRevision 进行分组并在date 上聚合

Revision.objects.all().values('document').aggregate(Max('date'))

【讨论】:

  • 不幸的是,该代码为我的模型返回了一个空查询集,但我根据提供的链接接受了,谢谢!
【解决方案2】:

您可以从这样的模型中获取最新的 9 条数据:

Model.objects.all().order_by('-date')[0:9]

【讨论】:

  • 这不是他要问的
  • 我在 Meta 类中已经有一个用于文档修订的“get_latest_by”子句,所以找到最新的没有问题。但是我需要将它与“父”文档模型结合起来,并为每个文档获取最新版本。
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2016-09-28
  • 2013-10-20
相关资源
最近更新 更多