在 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 中对模型进行排序