在python/django中更新queryset会在迭代时引发错误

在python/django中更新queryset会在迭代时引发错误,python,django,Python,Django,我有一个有序查询,我想将其附加到列表中,然后根据价格将其拆分为子列表。我的代码如下: def home(books): grouped_books = [] for i in range(len(books) - 1): this_book = books[i].price next_book = books[i+1].price if this_book != next_book and price >= 100: r = books[:i+

我有一个有序查询,我想将其附加到列表中,然后根据价格将其拆分为子列表。我的代码如下:

def home(books):

grouped_books = []

for i in range(len(books) - 1):
    this_book = books[i].price
    next_book = books[i+1].price

    if this_book != next_book and price >= 100:
        r = books[:i+1]
        grouped_books.append(r)
        for ob in grouped_books:
           books = books.exclude(id__in=[o.id for o in ob])

在更新查询后进行迭代时,此代码会抛出一个错误,
列表索引超出范围

我做错什么了吗?谢谢你的帮助。
谢谢

A
QuerySet
不是一个列表。因此,使用
书籍[:i+1]
没有多大意义。此外,您还可以更改
书籍
。实际上,您编写
books=books.exclude(…)
。因此,这意味着如果减少
books
queryset中的元素数量,索引最终将超出范围。请注意,
范围(len(books)-1)
部分仅在
for
循环的开始处进行评估。因此没有更新

我觉得你把事情弄得太复杂了。您可以在按
价格
订购书籍的位置进行查询,然后使用:

从itertools导入groupby
从运算符导入吸引器
def主页(书籍):
返回[
列表(vs)
对于groupby(books.order\u by('price')、attrgetter('price')中的
]
或者,如果您希望按100的价格范围分组:

from itertools import groupby

def home(books):
    return [
        list(vs)
        for __, vs in groupby(books.order_by('price'), lambda b: b.price // 100)
    ]
从itertools导入groupby
def主页(书籍):
返回[
列表(vs)
对于groupby(books.order\u by('price')中的uuv,lambda b:b.price//100)

]
A
QuerySet
不是一个列表。因此,
books[:i+1]
将创建一个新的查询集。此外,您还使用了
books=books.exclude(..)
,这意味着在迭代之后
books
的长度发生了变化。
范围(…)
在开始迭代之前只对
书籍的长度进行一次评估。您能准确地解释一下您的目标吗?现在很难提出更优雅的解决方案。@WillemVanOnsem
books=books.objects.filter(添加了\u date\u lte=timezone.now()).order\u by('price')
这是我检索某些对象的查询。所有价格低于100美元的书都要进一步计算。而价格超过200和300的,则分别进行不同的计算。因此,我想制作一个列表,可以获取这些对象的子列表,然后您可以使用
groupby
from itertools import groupby

def home(books):
    return [
        list(vs)
        for __, vs in groupby(books.order_by('price'), lambda b: b.price // 100)
    ]