Django 获取查询集中的最后一条记录
如何检索某个查询集中的最后一条记录?编辑:您现在必须使用Django 获取查询集中的最后一条记录,django,django-queryset,Django,Django Queryset,如何检索某个查询集中的最后一条记录?编辑:您现在必须使用 您可以使用以下方法简单地执行以下操作: 另外,请注意Django文档中的警告: 。。。请注意,reverse()应该 通常只能在查询集上调用 具有定义的顺序(例如。, 当查询一个模型时 定义默认顺序,或在 使用order\u by())。如果没有这样的命令 是为给定的查询集定义的, 对其调用reverse(),没有实际意义 影响(顺序未定义) 在调用reverse()之前,将 未定义) : latest(field\u name=Non
您可以使用以下方法简单地执行以下操作: 另外,请注意Django文档中的警告: 。。。请注意,
reverse()
应该
通常只能在查询集上调用
具有定义的顺序(例如。,
当查询一个模型时
定义默认顺序,或在
使用order\u by()
)。如果没有这样的命令
是为给定的查询集定义的,
对其调用reverse()
,没有实际意义
影响(顺序未定义)
在调用reverse()
之前,将
未定义)
:
latest(field\u name=None)
使用提供的字段名称作为日期字段,按日期返回表中最新的对象
此示例根据
发布日期
字段:
Entry.objects.latest('pub_date')
不必担心当前顺序的最简单方法是将QuerySet转换为列表,这样就可以使用Python的常规负索引。像这样:
list(User.objects.all())[-1]
如果使用django 1.6和更高版本,那么随着新api的引入,现在就容易多了-
Model.object.earliest()
它将给出方向相反的latest()
p、 我知道这是一个老问题,我发帖的时候好像有人在问这个问题,他们会了解这个新功能,而不是使用老方法。Django>=1.6
添加了QuerySet方法first()和last(),这是返回与筛选器匹配的第一个或最后一个对象的方便方法。如果没有匹配的对象,则返回None。当queryset已用尽时,您可以这样做以避免另一个db提示-
last = queryset[len(queryset) - 1] if queryset else None
不要使用尝试…除非…
在这种情况下,Django不会抛出索引器。
它抛出AssertionError
或ProgrammingError
(当您使用-O选项运行python时)最简单的方法是:
books.objects.all().last()
您还可以使用它来获取第一个条目,如下所示:
books.objects.all().first()
要获取第一个对象,请执行以下操作:
ModelName.objects.first()
要获取最后一个对象,请执行以下操作:
ModelName.objects.last()
你可以使用过滤器
ModelName.objects.filter(name='simple').first()
这对我很有用。您可以使用Model.objects.last()
或Model.objects.first()
。
如果未定义排序
,则根据主键对查询集进行排序。如果要设置排序行为查询,则可以参考最后两点
如果您正在考虑执行此操作,Model.objects.all().last()
检索last,而Model.objects.all().first()
检索查询集中的第一个元素,或者使用过滤器
,无需再三考虑。然后看下面的一些注意事项
这里需要注意的重要部分是,如果您的模型中没有包含任何排序
,那么数据可以是任意顺序的,并且您将有一个不期望的随机最后或第一个元素
例如,假设您有一个名为Model1
的模型,它有两列id
和item\u count
,其中10行的id为1到10。[没有定义排序]
如果像这样获取Model.objects.all().last(),则可以从10个元素的列表中获取任何元素。是的,它是随机的,因为没有默认顺序
那么我们能做些什么呢
您可以基于模型上的任何一个或多个字段定义排序
。它也有性能问题,请检查一下。参考:
或者,您可以在提取时通过
使用order\u。
如下所示:Model.objects.order\u by('item\u count').last()
正如django docs中所说:“请注意,通常只应在具有已定义顺序的QuerySet上调用reverse()(例如,在查询定义默认顺序的模型时,或在使用order_by()时)。如果没有为给定QuerySet定义此类顺序,则对其调用reverse()没有实际效果(在调用reverse()之前,顺序未定义,之后将保持未定义)。“2017年,接受的答案现在已过期。如下所示,您应该使用queryset.last()。这将查询数据库中的所有对象,然后获取第一个。很好!显然,通过.reverse()答案,您没有想到这一点(当前选中)是正确的方法!这是一个简洁的方法。此外,“如果您的模型的元指定get_latest_by,您可以根据文档将field_name参数保留为latest()”。from docs:earliest()和latest()需要在模型books.objects.last()中使用field_name参数或“get_latest_by”
和books.objects.first()
应该可以解决这个问题。这应该是与XYZ.objects.first()
和XYZ.objects.last()一起接受的答案
我认为Arnaud P的方法更合适。如果没有弄错的话,这将解压数据库中的所有项目,后者将使用DB查询提取最后一个项目。假设您的查询集已经排序,这应该是“首选答案”,因为这是唯一不会再次访问数据库的解决方案。
ModelName.objects.filter(name='simple').first()