如何检索某个查询集中的最后一条记录?
答案 0 :(得分:109)
latest(field_name=None)
使用date_name作为日期字段,按日期返回表格中的最新对象。此示例返回表中的最新条目,根据
pub_date
字段:Entry.objects.latest('pub_date')
答案 1 :(得分:70)
你可以使用reverse()
:
queryset.reverse()[0]
另外,请注意Django文档中的此警告:
...请注意
reverse()
应该 通常只在QuerySet上调用 具有定义的顺序(例如, 查询模型的时候 定义默认排序,或何时 使用order_by()
)。如果没有这样的订购 是为给定的QuerySet
定义的, 在它上面调用reverse()
并不真实 效果(排序未定义 在致电reverse()
之前,并且会 之后仍未定义。
答案 2 :(得分:31)
Django> = 1.6
添加了QuerySet方法first()和last(),它们是返回匹配过滤器的第一个或最后一个对象的便捷方法。如果没有匹配的对象,则返回None。
答案 3 :(得分:29)
最简单的方法是:
books.objects.all().last()
您还可以使用它来获取第一个条目:
books.objects.all().first()
答案 4 :(得分:19)
获取第一个对象:
if err != nil {
_, ok := err.(*json.UnsupportedTypeError)
if ok {
return []byte("Tried to Marshal Invalid Type")
} else {
return []byte("Venue does not exist")
}
}
获取最后的对象:
ModelName.objects.first()
您可以使用过滤器
ModelName.objects.last()
这适合我。
答案 5 :(得分:5)
当查询集已经用尽时,您可以这样做以避免另一个db提示 -
last = queryset[len(queryset) - 1] if queryset else None
请勿使用try...except...
在这种情况下,Django不会抛出IndexError
它会抛出AssertionError
或ProgrammingError
(使用-O选项运行python时)
答案 6 :(得分:3)
如果使用django 1.6及以上版本,现在随着新api的推出它会更容易 -
Model.object.earliest()
它将给出反向的latest()。
P.S。 - 我知道它的旧问题,我发帖就好像前进某人就这个问题着陆,他们开始了解这个新功能而不是最终使用旧方法。
答案 7 :(得分:1)
您可以使用Model.objects.last()
或Model.objects.first()
。
如果未定义ordering
,则根据主键对查询集进行排序。如果要订购行为查询集,则可以参考最后两点。
如果您打算这样做,请Model.objects.all().last()
检索最后一个,Model.objects.all().first()
检索一个查询集中的第一个元素,或者使用filters
而不用考虑。然后在下面看到一些注意事项。
这里要注意的重要部分是,如果您的模型中未包含任何ordering
,则数据可以按任何顺序排列,并且您将有一个意料之外的随机的last或first元素。
例如。假设您有一个名为Model1
的模型,该模型有2列id
和item_count
,其中10行ID为1到10。[未定义顺序]
如果像这样获取Model.objects.all()。last(),则可以从10个元素的列表中获取任何元素。是的,它是随机的,因为没有默认顺序。
那该怎么办?
ordering
。它也有性能问题,请也检查一下。参考:Here order_by
。
像这样:Model.objects.order_by('item_count').last()
答案 8 :(得分:-4)
最简单的方法是将QuerySet转换为列表,以便您可以使用Python的正常负索引,而无需担心当前的排序。像这样:
list(User.objects.all())[-1]