Python last()和[]运算符给出不同的结果

Python last()和[]运算符给出不同的结果,python,django,Python,Django,我有一个RSSFeed型号。 要获取数据库中的最后一个元素,我需要: RSSFeed.objects.last() # Output: <RSSFeed: www.sooperarticles.com> 使用first和括号运算符是一致的: first_ten_feeds.first() # Output: <RSSFeed: pressetext News> first_ten_feeds[0] # Output: <RSSFeed: pressetext Ne

我有一个RSSFeed型号。 要获取数据库中的最后一个元素,我需要:

RSSFeed.objects.last()
# Output: <RSSFeed: www.sooperarticles.com>
使用first和括号运算符是一致的:

first_ten_feeds.first()
# Output: <RSSFeed: pressetext News>
first_ten_feeds[0]
# Output: <RSSFeed: pressetext News>
first_ten_feeds[9]
# Output: <RSSFeed: FinanzNachrichten.de: Nachrichten zu IT-Dienstleistungen>

first_ten_feeds.last()
# Output: <RSSFeed: www.sooperarticles.com>
first\u ten\u feed.first()
#输出:
第一个十个订阅源[0]
#输出:
但使用last和方括号运算符不一致:

first_ten_feeds.first()
# Output: <RSSFeed: pressetext News>
first_ten_feeds[0]
# Output: <RSSFeed: pressetext News>
first_ten_feeds[9]
# Output: <RSSFeed: FinanzNachrichten.de: Nachrichten zu IT-Dienstleistungen>

first_ten_feeds.last()
# Output: <RSSFeed: www.sooperarticles.com>
first_ten_feed[9]
#输出:
前十个feed.last()
#输出:
为什么??对于上面的last()和[],我希望得到相同的结果


RSSFeed.objects.last()
first\u ten\u feed.last()
似乎给出了相同的结果,但这对我来说没有意义。

答案实际上在代码中
QuerySet.last()
定义为

    for obj in (self.reverse() if self.ordered else self.order_by('-pk'))[:1]:
        return obj
QuerySet.reverse()
基本上是返回QuerySet的克隆,因此基本上不是

SELECT (...) from yourmodel ORDER BY somefield ASC LIMIT 10
SQL查询变为:

SELECT (...) from yourmodel ORDER BY somefield DESC LIMIT 10
因此
first\u ten\u feed.last()
将实际返回与
RSSFeed.objects.last()相同的内容


这种行为非常令人惊讶,更不用说完全出乎意料,我强烈建议您在django的问题跟踪器上填写一份错误报告——要么是预期的行为(至少对于django开发人员而言),然后应该清楚地记录下来,要么是一个普通的错误。

答案实际上在代码中
QuerySet.last()
定义为

    for obj in (self.reverse() if self.ordered else self.order_by('-pk'))[:1]:
        return obj
QuerySet.reverse()
基本上是返回QuerySet的克隆,因此基本上不是

SELECT (...) from yourmodel ORDER BY somefield ASC LIMIT 10
SQL查询变为:

SELECT (...) from yourmodel ORDER BY somefield DESC LIMIT 10
因此
first\u ten\u feed.last()
将实际返回与
RSSFeed.objects.last()相同的内容



这种行为非常令人惊讶,更不用说完全出乎意料,我强烈建议您在django的问题跟踪器上填写一份bug报告——要么是预期的行为(至少对django开发人员而言),然后应该清楚地记录下来,或者它是一个普通的bug。

Django给出了AssertionError,因为一旦获取了一个片段,它就无法对查询进行重新排序。我不知道你为什么没有得到它。@IshwarJangid你在哪里看到过重新排序?@bruno desthuilliers调用
最后一个
将通过
-pk
键重新排序,如果以前没有应用过。@Take_Care__确实,我刚刚看到了这一点-因此Ishwar的答案是:因为他的模型定义了默认排序。对于Django 2.1.5,对于没有默认排序的模型,对于
first()。对于具有默认顺序的型号,
first()
有效,
last()
给出错误。因此,我无法用可用信息复制上述行为。你能给我们看看RSSFeed型号吗?Django的版本是什么?Django提供了AssertionError,因为一旦获取了一个片段,它就无法对查询进行重新排序。我不知道你为什么没有得到它。@IshwarJangid你在哪里看到过重新排序?@bruno desthuilliers调用
最后一个
将通过
-pk
键重新排序,如果以前没有应用过。@Take_Care__确实,我刚刚看到了这一点-因此Ishwar的答案是:因为他的模型定义了默认排序。对于Django 2.1.5,对于没有默认排序的模型,对于
first()。对于具有默认顺序的型号,
first()
有效,
last()
给出错误。因此,我无法用可用信息复制上述行为。你能给我们看看RSSFeed型号吗?你的Django版本是什么?有趣的是,我是第一个遇到这个“bug”的人,因为last()实际上是一个非常基本的东西。是的,实际上我也有点惊讶。或者同时使用切片和
last
可能也不太常见-我显然至少从来没有这样做过(否则我肯定会发现这一点),而且我已经在几十个Django项目上工作过……它不太常见的一个原因是它给大多数人带来了一个错误:)。具体地说,
reverse()
last()
禁止用于切片查询集。您使用的是哪个Django版本?@EndreBoth我几乎经常为我的模型指定默认排序,所以我没有“切片查询集/排序”问题。请参阅我对默认排序问题的评论。嗯,有趣的是,我是第一个遇到此“错误”的人,因为最后()这是一件很基本的事情。是的,我也有点惊讶。或者同时使用切片和
last
可能也不太常见-我显然至少从来没有这样做过(否则我肯定会发现这一点),而且我已经在几十个Django项目上工作过……它不太常见的一个原因是它给大多数人带来了一个错误:)。具体地说,
reverse()
last()
禁止用于切片查询集。您使用的是哪个Django版本?@EndreBoth我几乎经常为我的模型指定默认排序,因此我不会遇到“切片查询集/排序”问题。请参阅我对默认排序问题的评论。