获取查询集中的最后一条记录
如何检索某个查询集中的最后一条记录?
How can I retrieve the last record in a certain queryset?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如何检索某个查询集中的最后一条记录?
How can I retrieve the last record in a certain queryset?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(13)
Django 文档:
Django Doc:
编辑:您现在必须使用
Entry.objects.latest('pub_date')
您可以简单地使用
reverse()
:另外,请注意 Django 文档中的此警告:
EDIT : You now have to use
Entry.objects.latest('pub_date')
You could simply do something like this, using
reverse()
:Also, beware this warning from the Django documentation:
最简单的方法是:
您还可以使用它来获取第一个条目,如下所示:
The simplest way to do it is:
You also use this to get the first entry like so:
要获取第一个对象:
要获取最后一个对象:
您可以使用过滤器
这对我有用。
To get First object:
To get last objects:
You can use filter
This works for me.
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.
当查询集已经耗尽时,您可以这样做以避免另一个数据库提示 -
不要使用
try... except...
。在这种情况下,Django 不会抛出
IndexError
。它抛出
AssertionError
或ProgrammingError
(当您使用 -O 选项运行 python 时)When the queryset is already exhausted, you may do this to avoid another db hint -
Don't use
try...except...
.Django doesn't throw
IndexError
in this case.It throws
AssertionError
orProgrammingError
(when you run python with -O option)您可以使用
Model.objects.last()
或Model.objects.first()
。如果没有定义排序,则查询集将根据主键进行排序。如果你想要排序行为查询集那么你可以参考最后两点。
如果您想这样做,请使用
Model.objects.all().last()
检索最后一个,并使用Model.objects.all().first()
检索查询集中的第一个元素或不假思索地使用过滤器
。然后请参阅下面的一些注意事项。这里需要注意的重要部分是,如果您的模型中没有包含任何
ordering
,则数据可以采用任何顺序,并且您将获得一个意想不到的随机最后一个或第一个元素。例如。假设您有一个名为
Model1
的模型,它有 2 列id
和item_count
,其中 10 行的 id 为 1 到 10。[没有定义顺序]如果你像这样获取 Model.objects.all().last() ,你可以从 10 个元素的列表中获取任何元素。是的,它是随机的,因为没有默认顺序。
那么可以做什么呢?
排序
。它也存在性能问题,也请检查。参考:此处order_by< /code> 获取时。
像这样:
Model.objects.order_by('item_count').last()
You can use
Model.objects.last()
orModel.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 andModel.objects.all().first()
to retrieve first element in a queryset or usingfilters
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 columnsid
anditem_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?
ordering
based on any field or fields on your model. It has performance issues as well, Please check that also. Ref: Hereorder_by
while fetching.Like this:
Model.objects.order_by('item_count').last()
如果使用 django 1.6 及更高版本,随着新 api 的引入,现在会更容易 -
它将提供相反方向的latest()。
ps - 我知道它的老问题,我发帖就好像有人解决这个问题一样,他们会了解这个新功能,而不会最终使用旧方法。
If using django 1.6 and up, its much easier now as the new api been introduced -
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.
如果您在模型中使用 ids,则可以通过这种方式从 qs 获取最新的 ids。
If you use ids with your models, this is the way to go to get the latest one from a qs.
在 Django 模板中,我必须执行类似的操作才能使其与反向查询集一起使用:
希望这可以帮助人们了解这个主题。
In a Django template I had to do something like this to get it to work with a reverse queryset:
Hope this helps someone looking around on this topic.
您可以尝试以下操作:
MyModel.objects.order_by('-id')[:1]
You can try this:
MyModel.objects.order_by('-id')[:1]
最简单的方法(无需担心当前的排序)是将 QuerySet 转换为列表,以便您可以使用 Python 的正常负索引。就像这样:
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: