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

Ste*_*en 75 django django-queryset

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

Asi*_*nox 122

Django Doc:

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

此示例根据以下pub_date字段返回表中的最新条目 :

Entry.objects.latest('pub_date')
Run Code Online (Sandbox Code Playgroud)

  • 这也有效.`Entry.objects.latest( 'ID')` (24认同)
  • 这是做到这一点的巧妙方法.此外,"如果您的模型的Meta指定了get_latest_by,则可以根据文档将field_name参数保留为latest()". (5认同)

juj*_*ule 73

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

queryset.reverse()[0]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 2017年和接受的答案现已过时.如下所示,您应该使用queryset.last(). (4认同)
  • 如django docs中所述:“请注意,通常只应在具有已定义顺序的QuerySet上调用reverse()(例如,在查询定义了默认顺序的模型时或在使用order_by()时)。这种顺序是为给定的QuerySet定义的,在其上调用reverse()并没有实际效果(该顺序在调用reverse()之前是未定义的,以后将保持不确定)。” (2认同)
  • 我已经在你的答案中编辑了那个警告,希望没问题. (2认同)

pan*_*ore 32

Django> = 1.6

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


hak*_*ash 31

最简单的方法是:

books.objects.all().last()
Run Code Online (Sandbox Code Playgroud)

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

books.objects.all().first()
Run Code Online (Sandbox Code Playgroud)

  • `books.objects.last()`和`books.objects.first()`应该可以解决问题. (9认同)

Rav*_*mar 23

获取First对象:

ModelName.objects.first()
Run Code Online (Sandbox Code Playgroud)

要获取最后的对象:

ModelName.objects.last()
Run Code Online (Sandbox Code Playgroud)

你可以使用过滤器

ModelName.objects.filter(name='simple').first()
Run Code Online (Sandbox Code Playgroud)

这适合我.


jif*_*yin 6

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

last = queryset[len(queryset) - 1] if queryset else None
Run Code Online (Sandbox Code Playgroud)

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


Ros*_*nde 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()