21

具体来说,我有一个模型,它有一个像这样的字段

pub_date = models.DateField("date published")

我希望能够轻松抓取最新的对象pub_date。最简单/最好的方法是什么?

像下面这样的东西会做我想要的吗?

Edition.objects.order_by('pub_date')[:-1]
4

5 回答 5

33
obj = Edition.objects.latest('pub_date')

您还可以通过放入get_latest_by模型的 Meta 来简化事情,然后您就可以做到

obj = Edition.objects.latest()

有关更多信息,请参阅文档。您可能还想设置orderingMeta 选项。

于 2008-10-31T00:34:02.047 回答
22

哈雷的回答是根据特定模型的某些订购标准想要最新的情况,但一般的解决方案是颠倒顺序并检索第一项:

Edition.objects.order_by('-pub_date')[0]
于 2008-10-31T01:59:17.337 回答
4

笔记:

普通的 python 列表接受负索引,它表示从列表末尾的偏移量,而不是像正数一样的开头。但是,QuerySet 对象会引发

AssertionError:不支持负索引。
如果您使用负索引,这就是为什么您必须执行 insin 所说的:反转排序并获取0th元素。

于 2008-10-31T03:01:01.783 回答
2

小心使用

Edition.objects.order_by('-pub_date')[0]

因为您可能正在索引一个空的 QuerySet。我不确定正确的 Pythonic 方法是什么,但最简单的方法是将其包装在 if/else 或 try/catch 中:

try:
    last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
    # Didn't find anything...

但是,正如@Harley 所说,当您按日期订购时,这latest()是 django 的方式

于 2008-11-02T19:26:59.963 回答
0

这已经得到了回答,但为了获得更多参考,这是Django Book关于在 QuerySets 上切片数据的内容:

请注意,不支持负切片:

>>> Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
  ...
AssertionError: Negative indexing is not supported.

不过,这很容易解决。只需更改 order_by() 语句,如下所示:

>>> Publisher.objects.order_by('-name')[0]

有关更多此类详细信息,请参阅链接。希望有帮助!

于 2013-07-31T06:53:41.230 回答