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

发布于 2024-08-20 06:10:46 字数 25 浏览 7 评论 0原文

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

How can I retrieve the last record in a certain queryset?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

楠木可依 2024-08-27 06:10:46

Django 文档

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

此示例根据
pub_date 字段:

Entry.objects.latest('pub_date')

Django Doc:

latest(field_name=None) returns the latest object in the table, by date, using the field_name provided as the date field.

This example returns the latest Entry in the table, according to the
pub_date field:

Entry.objects.latest('pub_date')
奢望 2024-08-27 06:10:46

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


您可以简单地使用 reverse()

queryset.reverse()[0]

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

...请注意 reverse() 应该
通常仅在 QuerySet 上调用
它有一个定义的顺序(例如,
当查询模型时
定义默认顺序,或者当
使用order_by())。如果没有这样的订购
是为给定的QuerySet定义的,
在其上调用 reverse() 没有真正的
效果(顺序未定义
在调用 reverse() 之前,并且将
之后保持未定义状态)。

EDIT : You now have to use Entry.objects.latest('pub_date')


You could simply do something like this, using reverse():

queryset.reverse()[0]

Also, beware this warning from the Django documentation:

... note that reverse() should
generally only be called on a QuerySet
which has a defined ordering (e.g.,
when querying against a model which
defines a default ordering, or when
using order_by()). If no such ordering
is defined for a given QuerySet,
calling reverse() on it has no real
effect (the ordering was undefined
prior to calling reverse(), and will
remain undefined afterward).

肤浅与狂妄 2024-08-27 06:10:46

最简单的方法是:

books.objects.all().last()

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

books.objects.all().first()

The simplest way to do it is:

books.objects.all().last()

You also use this to get the first entry like so:

books.objects.all().first()
强者自强 2024-08-27 06:10:46

要获取第一个对象:

ModelName.objects.first()

要获取最后一个对象:

ModelName.objects.last()

您可以使用过滤器

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

这对我有用。

To get First object:

ModelName.objects.first()

To get last objects:

ModelName.objects.last()

You can use filter

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

This works for me.

那一片橙海, 2024-08-27 06:10:46

Django >= 1.6

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

Django >= 1.6

Added QuerySet methods first() and last() which are convenience methods returning the first or last object matching the filters. Returns None if there are no objects matching.

恬淡成诗 2024-08-27 06:10:46

当查询集已经耗尽时,您可以这样做以避免另一个数据库提示 -

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

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

When the queryset is already exhausted, you may do this to avoid another db hint -

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

Don't use try...except....
Django doesn't throw IndexError in this case.
It throws AssertionError or ProgrammingError(when you run python with -O option)

小镇女孩 2024-08-27 06:10:46

您可以使用 Model.objects.last()Model.objects.first()
如果没有定义排序,则查询集将根据主键进行排序。如果你想要排序行为查询集那么你可以参考最后两点。

如果您想这样做,请使用 Model.objects.all().last() 检索最后一个,并使用 Model.objects.all().first() 检索查询集中的第一个元素或不假思索地使用过滤器。然后请参阅下面的一些注意事项。

这里需要注意的重要部分是,如果您的模型中没有包含任何ordering,则数据可以采用任何顺序,并且您将获得一个意想不到的随机最后一个或第一个元素。

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

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

那么可以做什么呢?

  1. 您可以根据模型上的任何一个或多个字段定义排序。它也存在性能问题,也请检查。参考:此处
  2. 或者您可以使用 order_by< /code> 获取时。
    像这样:Model.objects.order_by('item_count').last()

You can use Model.objects.last() or Model.objects.first().
If no ordering is defined then the queryset is ordered based on the primary key. If you want ordering behaviour queryset then you can refer to the last two points.

If you are thinking to do this, Model.objects.all().last() to retrieve last and Model.objects.all().first() to retrieve first element in a queryset or using filters without a second thought. Then see some caveats below.

The important part to note here is that if you haven't included any ordering in your model the data can be in any order and you will have a random last or first element which was not expected.

Eg. Let's say you have a model named Model1 which has 2 columns id and item_count with 10 rows having id 1 to 10.[There's no ordering defined]

If you fetch Model.objects.all().last() like this, You can get any element from the list of 10 elements. Yes, It is random as there is no default ordering.

So what can be done?

  1. You can define ordering based on any field or fields on your model. It has performance issues as well, Please check that also. Ref: Here
  2. OR you can use order_by while fetching.
    Like this: Model.objects.order_by('item_count').last()
情绪少女 2024-08-27 06:10:46

如果使用 django 1.6 及更高版本,随着新 api 的引入,现在会更容易 -

Model.object.earliest()

它将提供相反方向的latest()。

ps - 我知道它的老问题,我发帖就好像有人解决这个问题一样,他们会了解这个新功能,而不会最终使用旧方法。

If using django 1.6 and up, its much easier now as the new api been introduced -

Model.object.earliest()

It will give latest() with reverse direction.

p.s. - I know its old question, I posting as if going forward someone land on this question, they get to know this new feature and not end up using old method.

我不吻晚风 2024-08-27 06:10:46
MyModel.objects.order_by('-id')[:1]
MyModel.objects.order_by('-id')[:1]

如果您在模型中使用 ids,则可以通过这种方式从 qs 获取最新的 ids。

obj = Foo.objects.latest('id')

If you use ids with your models, this is the way to go to get the latest one from a qs.

obj = Foo.objects.latest('id')
单身狗的梦 2024-08-27 06:10:46

在 Django 模板中,我必须执行类似的操作才能使其与反向查询集一起使用:

thread.forumpost_set.all.last

希望这可以帮助人们了解这个主题。

In a Django template I had to do something like this to get it to work with a reverse queryset:

thread.forumpost_set.all.last

Hope this helps someone looking around on this topic.

安人多梦 2024-08-27 06:10:46

您可以尝试以下操作:

MyModel.objects.order_by('-id')[:1]

You can try this:

MyModel.objects.order_by('-id')[:1]

醉城メ夜风 2024-08-27 06:10:46

最简单的方法(无需担心当前的排序)是将 QuerySet 转换为列表,以便您可以使用 Python 的正常负索引。就像这样:

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

The simplest way, without having to worry about the current ordering, is to convert the QuerySet to a list so that you can use Python's normal negative indexing. Like so:

list(User.objects.all())[-1]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文