我有一个RSSFeed模型。 要获取数据库中的最后一个元素,我要做:
RSSFeed.objects.last()
# Output: <RSSFeed: www.sooperarticles.com>
我将其切片以获得查询中的前10个元素
first_ten_feeds = RSSFeed.objects.all()[:10]
首先使用且方括号运算符一致:
first_ten_feeds.first()
# Output: <RSSFeed: pressetext News>
first_ten_feeds[0]
# Output: <RSSFeed: pressetext News>
但是使用last和方括号运算符不一致:
first_ten_feeds[9]
# Output: <RSSFeed: FinanzNachrichten.de: Nachrichten zu IT-Dienstleistungen>
first_ten_feeds.last()
# Output: <RSSFeed: www.sooperarticles.com>
为什么?我希望上面的last()和[]会得到相同的结果。
RSSFeed.objects.last()
和first_ten_feeds.last()
似乎给出了相同的结果,但这对我来说没有意义。
答案 0 :(得分:2)
答案实际上在代码中。 QuerySet.last()
被定义为
for obj in (self.reverse() if self.ordered else self.order_by('-pk'))[:1]:
return obj
QuerySet.reverse()
的主要作用是返回查询集with the direction of the order by
clause reverted的克隆,因此基本上代替
SELECT (...) from yourmodel ORDER BY somefield ASC LIMIT 10
SQL查询变为:
SELECT (...) from yourmodel ORDER BY somefield DESC LIMIT 10
所以first_ten_feeds.last()
实际上会返回与RSSFeed.objects.last()
相同的东西。
这种行为doesn't really match the doc令人惊讶,并不是说完全出乎意料,我强烈建议您填写有关django问题跟踪工具的错误报告-要么是预期的行为(至少对django开发人员而言),那么应该清楚地记录下来,或者这是一个普通的错误。