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

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()

请参阅文档了解更多信息。您可能还想设置 ordering 元选项。

其他提示

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]

请参阅链接以获取更多此类详细信息。希望有所帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top