我做了一个小的Django项目,我想比较添加的对象以找到dublets(我已经使用了unique_together
Meta选项,但这完全不符合我的需要。)
当我启动脚本时,它会在100次迭代后完成,尽管有大约60000个对象。
objects = Django_app.objects.all()
for object_a in objects:
for object_b in objects:
compare( object_a, object_b)
有人可以解释这种行为吗?
解决方案:
objects = list( objects.all() )
谢谢大家!
答案 0 :(得分:2)
迭代列表时,Python使用指针遍历对象列表。迭代同一个对象(相同的项目列表)时,Python会小心使用两个单独的指针。因此,当您执行objects = list(objects)
时,这将创建一个普通的Python对象列表。对objects
的嵌套迭代与预期的一样工作。使用Django Querysets,行为有些不同。 Queryset是从数据库中获取的,只有一个指针。将Queryset强制转换为常规列表是最简单的解决方法。