在django中,如何在字段上对模型进行排序然后获取最后一项?
-
05-07-2019 - |
题
具体来说,我的模型有一个像这样的字段
pub_date = models.DateField("date published")
我希望能够使用最新的 pub_date
轻松获取对象。最简单/最好的方法是什么?
以下的事情能做我想要的吗?
Edition.objects.order_by('pub_date')[:-1]
解决方案
obj = Edition.objects.latest('pub_date')
您还可以通过 get_latest_by
,那么你就能做到
obj = Edition.objects.latest()
其他提示
Harley的答案是你想要根据特定型号的某些订购标准获得最新情况的方法,但一般的解决方案是颠倒订购并检索第一项:
Edition.objects.order_by('-pub_date')[0]
注意:强>
普通python列表接受负索引,它表示从列表末尾的偏移量,而不是像正数一样的开头。但是,如果使用负索引,QuerySet对象将引发
AssertionError: Negative indexing is not supported.,这就是为什么你必须做的事情:反转排序并获取
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()
是 djangonic 的方式。
这已经得到了解答,但为了更多参考,这就是 Django Book 不得不说在QuerySet上切片数据:
请注意,不支持否定切片:
>>> 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]
请参阅链接以获取更多此类详细信息。希望有所帮助!
不隶属于 StackOverflow