Django -> queryset[index] 索引超出范围

Posted

技术标签:

【中文标题】Django -> queryset[index] 索引超出范围【英文标题】:Django -> queryset[index] Index out of range 【发布时间】:2017-06-19 18:20:46 【问题描述】:

我有一个包含 2663 个对象的查询集;当我尝试访问索引为 2662 的对象时,出现“索引超出范围”错误。我正在找人向我解释为什么会这样。

所以:

queryset = User_Answers.objects.all()\
            .\
            select_related('answer', 'answer__question',
                           'answer__question__admin',
                           'answer__question__category', 'mobile_user')\
            .order_by('answer__question', 'mobile_user__id', 'order')


queryset.count() = 2663

有 2663 个对象;当我尝试获取索引为 2662 的对象时,我得到了这个:

queryset[2662] -> IndexError列表索引超出范围

然后我检查一下:

queryset.last() == queryset[2661] -> 返回真

这怎么可能?

【问题讨论】:

欢迎来到 Stack Overflow。请不要创建仅链接到错误屏幕截图的问题。有一个Minimal, Complete, Verifiable Examples的原则,以便人们可以帮助调查这个问题。另见How to ask。 请以适当的格式发布您的问题和所有相关信息。错误消息/回溯应该是文本而不是图像。 @KlausD。立即查看 对象#2662有什么特别之处?你到底想做什么? 【参考方案1】:

来自order_by 的文档

在这里,每个事件可能有多个排序数据;每个具有多个子级的事件将多次返回到 order_by() 创建的新 QuerySet 中。 换句话说,在 QuerySet 上使用 order_by() 可能会返回比您开始工作时更多的项目 - 这可能既不预期也不有用。

因此,在使用多值字段对结果进行排序时要小心。如果您可以确定您订购的每件商品只有一个订购数据,那么这种方法应该不会出现问题。如果不是,请确保结果符合您的预期。

【讨论】:

以上是关于Django -> queryset[index] 索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

DJango filter_queryset

Django - 如何将 QuerySet 转换为 Q 对象?

django的queryset和objects对象

Django--QuerySet

QuerySet,对象没有属性 id - Django

如何在 Django 中覆盖“get_queryset()”