Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 获取查询集中的最后一条记录_Django_Django Queryset - Fatal编程技术网

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()