我在django应用程序中遇到了一个奇怪的问题,其中for循环正在跳过其他所有项目。我已经获取了一个返回的查询集并且list()
ed来迭代。这样做的目的是删除通过POST变量传递给视图的另一个列表中的项目。此视图是一个ajax请求,并返回需要推送到页面的JSON项列表。在下一个请求时,页面会传递页面上已有对象的ID列表,因此我可以从查询集中删除它们并仅传回新的查询集。我在代码的整个问题部分放了几个打印语句,并发现在页面的第一个请求上,列表进入页面为空,因为没有任何显示。查询运行并返回所有结果,然后显示在页面上。在第二个请求中,列表进入包含所有id的页面,这就是问题发生的地方:当我遍历查询集时,检查id是否在列表中,它只迭代奇数值(已删除)并返回偶数ID对象的列表,以便在页面上第二次显示。
代码:
items = list(listobj.getItems())
temp = items
print "Item List: ", temp
print "Rendered List: ", request.POST['rendered'].split(',')
for item in temp:
print "Item ID: ", str(item.id)
print "Rendered List: ", request.POST['rendered'].split(',')
if str(item.id) in request.POST['rendered'].split(','):
items.remove(item)
print "Removed Item: ", item.id
print "Unrendered Items: ", [item.id for item in items]
结果:
[02/Aug/2011 20:17:25] "GET /list/list HTTP/1.1" 200 6256
Item List: [<Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>]
Rendered List: [u'']
Item ID: 1
Rendered List: [u'']
Item ID: 2
Rendered List: [u'']
Item ID: 3
Rendered List: [u'']
Item ID: 4
Rendered List: [u'']
Item ID: 5
Rendered List: [u'']
Item ID: 6
Rendered List: [u'']
Item ID: 7
Rendered List: [u'']
Item ID: 8
Rendered List: [u'']
Item ID: 9
Rendered List: [u'']
Unrendered Items: [1, 2, 3, 4, 5, 6, 7, 8, 9]
[02/Aug/2011 20:17:25] "POST /items/ HTTP/1.1" 200 528
Item List: [<Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>]
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']
Item ID: 1
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']
Removed Item: 1
Item ID: 3
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']
Removed Item: 3
Item ID: 5
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']
Removed Item: 5
Item ID: 7
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']
Removed Item: 7
Item ID: 9
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']
Removed Item: 9
Unrendered Items: [2, 4, 6, 8]
[02/Aug/2011 20:17:55] "POST /items/ HTTP/1.1" 200 252
答案 0 :(得分:5)
temp
和items
引用相同的对象,因此当您执行items.remove()
时,您还要修改temp
。您可能希望temp = items[:]
复制items
列表的值。
答案 1 :(得分:1)
在迭代数据结构时,不应修改数据结构。
无论如何,这是一个更简洁,更高效的代码来执行您的操作:
items = list(listobj.getItems())
rendered = set((int(i) for i in request.POST['rendered'].split(',')))
unrendered = [item for item in items if item.id not in rendered]