在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)
]
AQuerySet
不是一个列表。因此,books[:i+1]
将创建一个新的查询集。此外,您还使用了books=books.exclude(..)
,这意味着在迭代之后books
的长度发生了变化。范围(…)
在开始迭代之前只对书籍的长度进行一次评估。您能准确地解释一下您的目标吗?现在很难提出更优雅的解决方案。@WillemVanOnsembooks=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)
]