在 django 中,如何对字段上的模型进行排序,然后获取最后一项?

Posted

技术标签:

【中文标题】在 django 中,如何对字段上的模型进行排序,然后获取最后一项?【英文标题】:In django, how do I sort a model on a field and then get the last item? 【发布时间】:2010-09-20 02:47:22 【问题描述】:

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

pub_date = models.DateField("date published")

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

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

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

【问题讨论】:

【参考方案1】:
obj = Edition.objects.latest('pub_date')

你也可以把get_latest_by放在模型的Meta中,这样你就可以做到了

obj = Edition.objects.latest()

请参阅the docs 了解更多信息。您可能还想设置ordering Meta 选项。

【讨论】:

【参考方案2】:

Harley 的答案是根据特定模型的某些排序标准想要最新的情况,但一般的解决方案是颠倒排序并检索第一个项目:

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

【讨论】:

【参考方案3】:

注意:

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

AssertionError: Negative indexing is not supported.
如果你使用负索引,这就是为什么你必须按照 insin 所说的去做:颠倒排序并获取 0th 元素。

【讨论】:

【参考方案4】:

小心使用

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 的方式。

【讨论】:

【参考方案5】:

这已经被回答了,但是为了更多的参考,这是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]

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

【讨论】:

以上是关于在 django 中,如何对字段上的模型进行排序,然后获取最后一项?的主要内容,如果未能解决你的问题,请参考以下文章

从显示自定义字段的 Django 模型呈现可排序表的最佳方法?

按模型的属性(不是字段)对 Django QuerySet 进行排序

django - 根据翻译后的名称在管理 ui 中对模型进行排序

如何在django admin中对不存在的字段进行排序/排序[重复]

Django模板按“不相关”模型的字段排序

通过相关模型上的过滤器对 list_display 字段进行排序