获取查询集中的最后一条记录


Answers:


80

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


您可以使用reverse()

queryset.reverse()[0]

另外,请注意Django文档中的以下警告:

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


2
如django docs中所述:“请注意,通常只应在具有已定义顺序的QuerySet上调用reverse()(例如,在查询定义了默认顺序的模型时或在使用order_by()时)。这种顺序是为给定的QuerySet定义的,在其上调用reverse()并没有实际效果(该顺序在调用reverse()之前是未定义的,以后将保持不确定)。”
jujule 2010年

6
2017年,现在接受的答案已过期。如下所示,您应该使用queryset.last()。
wobbily_col

134

Django文档

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

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

Entry.objects.latest('pub_date')

5
这是整齐的方法。此外,根据文档,“如果模型的Meta指定get_latest_by,则可以将field_name参数保留为Latest()”。
FredrikMöllerstrand'13

48

最简单的方法是:

books.objects.all().last()

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

books.objects.all().first()

15
books.objects.last() 并且books.objects.first()应该做到这一点。
chandan

这应该是公认的答案,XYZ.objects.first()以及 XYZ.objects.last()
slajma

我认为Arnaud P的方法更合适。如果没有记错的话,这将解压数据库中的所有项目,后者稍后将使用数据库查询提取最后一个项目。
拉乔

33

的Django> = 1.6

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


32

获取第一个对象:

ModelName.objects.first()

获取最后一个对象:

ModelName.objects.last()

您可以使用过滤器

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

这对我有用。


6

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

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

不要使用try...except...
DjangoIndexError在这种情况下不会抛出异常。
抛出AssertionErrorProgrammingError(当您使用-O选项运行python时)


1
假设您的查询集已经排序,那么这应该是“最佳答案”,因为这是不会再次访问数据库的唯一解决方案。
David D.

4

如果使用django 1.6及更高版本,由于引入了新的api,它现在要容易得多-

Model.object.earliest()

它将给出带有相反方向的latest()。

ps-我知道它的旧问题,我发贴好像有人在这个问题上前进,他们知道这个新功能,而最终没有使用旧方法。


3
从文档:最早的()和最新的()需要在模型无论是FIELD_NAME参数或“get_latest_by”
panchicore

1

您可以使用Model.objects.last()Model.objects.first()。如果ordering未定义,则根据主键对查询集进行排序。如果要订购行为查询集,则可以参考最后两点。

如果您打算这样做,则可以不加思索地在查询集中Model.objects.all().last()检索最后一个和Model.objects.all().first()检索第一个元素filters。然后在下面看到一些注意事项。

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

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

如果以这种方式获取Model.objects.all()。last(),则可以从10个元素的列表中获取任何元素。是的,这是随机的,因为没有默认顺序。

那该怎么办呢?

  1. 您可以ordering基于模型上的任何一个或多个字段进行定义。它也有性能问题,请也检查一下。参考:这里
  2. 或者您可以order_by在提取时使用。像这样:Model.objects.order_by('item_count').last()

-5

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

list(User.objects.all())[-1]

2
这将从数据库查询所有对象,然后采用第一个对象
warvariuc 2013年

好点子!显然没有想到这一点。.reverse()答案(当前已选择)是正确的选择!
乔什·乌里斯曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.