104

如何检索某个查询集中的最后一条记录?

4

11 回答 11

151

Django 文档

latest(field_name=None)使用作为日期字段提供的 field_name 按日期返回表中的最新对象。

本例根据 pub_date字段返回表中最新的Entry:

Entry.objects.latest('pub_date')
于 2010-08-23T07:42:19.397 回答
93

编辑:你现在必须使用Entry.objects.latest('pub_date')


你可以简单地做这样的事情,使用reverse()

queryset.reverse()[0]

另外,请注意 Django 文档中的这个警告:

...请注意,reverse()通常只能在具有已定义排序的 QuerySet 上调用(例如,在针对定义默认排序的模型进行查询时,或在使用时order_by())。如果没有为给定的顺序定义这样的顺序QuerySet,则调用reverse()它没有实际效果(顺序在调用之前是未定义的reverse(),之后将保持未定义)。

于 2010-02-03T09:57:29.657 回答
68

最简单的方法是:

books.objects.all().last()

您还可以使用它来获取第一个条目,如下所示:

books.objects.all().first()
于 2015-11-13T09:57:22.077 回答
43

获取第一个对象:

ModelName.objects.first()

要获取最后一个对象:

ModelName.objects.last()

您可以使用过滤器

ModelName.objects.filter(name='simple').first()

这对我有用。

于 2015-11-25T12:24:19.620 回答
35

Django >= 1.6

添加了 QuerySet 方法 first() 和 last(),它们是返回匹配过滤器的第一个或最后一个对象的便捷方法。如果没有匹配的对象,则返回 None。

于 2014-01-21T01:14:32.663 回答
8

当查询集已经用尽时,您可以这样做以避免另一个数据库提示 -

last = queryset[len(queryset) - 1] if queryset else None

不要使用try...except.... 在这种情况下,
Django 不会抛出。 它抛出或(当您使用 -O 选项运行 python 时)IndexError
AssertionErrorProgrammingError

于 2014-05-14T04:26:18.117 回答
5

您可以使用Model.objects.last()Model.objects.first()。如果没有ordering定义,那么查询集是根据主键排序的。如果您想要订购行为查询集,那么您可以参考最后两点。

如果您正在考虑这样做,Model.objects.all().last()请检索最后一个并Model.objects.all().first()检索查询集中的第一个元素或不加思索地使用filters。然后看看下面的一些警告。

这里要注意的重要部分是,如果您的模型中没有包含任何ordering数据,则数据可以按任何顺序排列,并且您将有一个意外的随机最后或第一个元素。

例如。假设您有一个名为的模型Model1,它有 2 列iditem_count10 行,id 为 1 到 10。[没有定义排序]

如果您像这样获取 Model.objects.all().last(),您可以从 10 个元素的列表中获取任何元素。是的,它是随机的,因为没有默认排序。

那么可以做些什么呢?

  1. 您可以ordering根据模型上的任何一个或多个字段进行定义。它也有性能问题,请也检查一下。参考:这里
  2. 或者您可以order_by在获取时使用。像这样:Model.objects.order_by('item_count').last()
于 2020-03-26T18:52:46.017 回答
4

如果使用 django 1.6 及更高版本,随着新 api 的引入,它现在更容易 -

Model.object.earliest()

它将给 latest() 反向。

ps - 我知道它的老问题,我发帖好像有人在这个问题上登陆,他们了解这个新功能,而不是最终使用旧方法。

于 2014-01-11T21:16:53.020 回答
0

在 Django 模板中,我必须执行以下操作才能使其与反向查询集一起使用:

thread.forumpost_set.all.last

希望这有助于有人在这个话题上环顾四周。

于 2021-11-24T01:11:45.180 回答
0
MyModel.objects.order_by('-id')[:1]
于 2021-12-21T08:44:57.397 回答
-7

无需担心当前排序的最简单方法是将 QuerySet 转换为列表,以便您可以使用 Python 的正常负索引。像这样:

list(User.objects.all())[-1]
于 2013-02-07T15:14:48.480 回答