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

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

pub_date = models.DateField("date published")

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

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

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

【问题讨论】:

    标签: sql django sorting django-models


    【解决方案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]
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-01-11
              • 1970-01-01
              • 2019-03-24
              • 1970-01-01
              • 2017-02-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多