如何检索某个查询集中的最后一条记录?
11 回答
latest(field_name=None)
使用作为日期字段提供的 field_name 按日期返回表中的最新对象。本例根据
pub_date
字段返回表中最新的Entry:Entry.objects.latest('pub_date')
编辑:你现在必须使用Entry.objects.latest('pub_date')
你可以简单地做这样的事情,使用reverse()
:
queryset.reverse()[0]
另外,请注意 Django 文档中的这个警告:
...请注意,
reverse()
通常只能在具有已定义排序的 QuerySet 上调用(例如,在针对定义默认排序的模型进行查询时,或在使用时order_by()
)。如果没有为给定的顺序定义这样的顺序QuerySet
,则调用reverse()
它没有实际效果(顺序在调用之前是未定义的reverse()
,之后将保持未定义)。
最简单的方法是:
books.objects.all().last()
您还可以使用它来获取第一个条目,如下所示:
books.objects.all().first()
获取第一个对象:
ModelName.objects.first()
要获取最后一个对象:
ModelName.objects.last()
您可以使用过滤器
ModelName.objects.filter(name='simple').first()
这对我有用。
Django >= 1.6
添加了 QuerySet 方法 first() 和 last(),它们是返回匹配过滤器的第一个或最后一个对象的便捷方法。如果没有匹配的对象,则返回 None。
当查询集已经用尽时,您可以这样做以避免另一个数据库提示 -
last = queryset[len(queryset) - 1] if queryset else None
不要使用try...except...
. 在这种情况下,
Django 不会抛出。
它抛出或(当您使用 -O 选项运行 python 时)IndexError
AssertionError
ProgrammingError
您可以使用Model.objects.last()
或Model.objects.first()
。如果没有ordering
定义,那么查询集是根据主键排序的。如果您想要订购行为查询集,那么您可以参考最后两点。
如果您正在考虑这样做,Model.objects.all().last()
请检索最后一个并Model.objects.all().first()
检索查询集中的第一个元素或不加思索地使用filters
。然后看看下面的一些警告。
这里要注意的重要部分是,如果您的模型中没有包含任何ordering
数据,则数据可以按任何顺序排列,并且您将有一个意外的随机最后或第一个元素。
例如。假设您有一个名为的模型Model1
,它有 2 列id
和item_count
10 行,id 为 1 到 10。[没有定义排序]
如果您像这样获取 Model.objects.all().last(),您可以从 10 个元素的列表中获取任何元素。是的,它是随机的,因为没有默认排序。
那么可以做些什么呢?
- 您可以
ordering
根据模型上的任何一个或多个字段进行定义。它也有性能问题,请也检查一下。参考:这里 - 或者您可以
order_by
在获取时使用。像这样:Model.objects.order_by('item_count').last()
如果使用 django 1.6 及更高版本,随着新 api 的引入,它现在更容易 -
Model.object.earliest()
它将给 latest() 反向。
ps - 我知道它的老问题,我发帖好像有人在这个问题上登陆,他们了解这个新功能,而不是最终使用旧方法。
在 Django 模板中,我必须执行以下操作才能使其与反向查询集一起使用:
thread.forumpost_set.all.last
希望这有助于有人在这个话题上环顾四周。
MyModel.objects.order_by('-id')[:1]
无需担心当前排序的最简单方法是将 QuerySet 转换为列表,以便您可以使用 Python 的正常负索引。像这样:
list(User.objects.all())[-1]