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

时间:2010-02-03 09:47:06

标签: django django-queryset

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

9 个答案:

答案 0 :(得分:109)

Django Doc

  

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 它会抛出AssertionErrorProgrammingError(使用-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列iditem_count,其中10行ID为1到10。[未定义顺序]

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

那该怎么办?

  1. 您可以基于模型上的任何一个或多个字段来定义ordering。它也有性能问题,请也检查一下。参考:Here
  2. 或者您可以在提取时使用order_by。 像这样:Model.objects.order_by('item_count').last()

答案 8 :(得分:-4)

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

list(User.objects.all())[-1]
相关问题