具体来说,我有一个模型,它有一个像这样的字段
pub_date = models.DateField("date published")
我希望能够轻松抓取最新的对象pub_date
。最简单/最好的方法是什么?
像下面这样的东西会做我想要的吗?
Edition.objects.order_by('pub_date')[:-1]
具体来说,我有一个模型,它有一个像这样的字段
pub_date = models.DateField("date published")
我希望能够轻松抓取最新的对象pub_date
。最简单/最好的方法是什么?
像下面这样的东西会做我想要的吗?
Edition.objects.order_by('pub_date')[:-1]
obj = Edition.objects.latest('pub_date')
您还可以通过放入get_latest_by
模型的 Meta 来简化事情,然后您就可以做到
obj = Edition.objects.latest()
哈雷的回答是根据特定模型的某些订购标准想要最新的情况,但一般的解决方案是颠倒顺序并检索第一项:
Edition.objects.order_by('-pub_date')[0]
笔记:
普通的 python 列表接受负索引,它表示从列表末尾的偏移量,而不是像正数一样的开头。但是,QuerySet 对象会引发
AssertionError:不支持负索引。如果您使用负索引,这就是为什么您必须执行 insin 所说的:反转排序并获取
0th
元素。
小心使用
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 的方式。
这已经得到了回答,但为了获得更多参考,这是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]
有关更多此类详细信息,请参阅链接。希望有帮助!