我有2张桌子。一个所有者可以没有任何物品,也可以有多个物品。
Item
id name owner_id (fk)
1 alpha 1
2 beta 1
Owner
id name attrc
1 owner1 complex_attr1
2 owner2 complex_attr2
我从数据库中分别作为列表检索它们:
for item in item_list:
for owner in owner_list:
if item.owner_id == owner.id:
# I modify owner attributes
owner.attrc = modify_funct(attrc)
item.owner = owner
我用HTML列出了Items
,并为每个Item
显示了Owner
中Item
的一些属性。在循环中,我将Owner
设为Item
对象的属性;事情是显示在html中,我需要修改一些Owner
原始db属性
因此在html模板创建中,我将得到类似的东西:
for item in item_list:
<div>
item.name
<span> item.owner.name<span>
<span> item.owner.attrc<span>
</div>
由于Owner with id 1
同时拥有Item with id 1 and 2
,因此在循环的第一个迭代中,attrc
被修改,在循环的第二个迭代中'attrc'已经被修改,并且函数没有找到预期的结果。
解决方案是使用另一个循环在外部循环/更改“ attrc”,然后循环item_list和owner_list,以减少循环?
答案 0 :(得分:1)
这不是最有效的解决方案,但是与您现有的代码最相似:
for owner in owner_list:
if any(item.owner_id == owner.id for item in item_list):
owner.attrc = modify_funct(attrc)
答案 1 :(得分:0)
使用设定的理解力更有效的解决方案:
owner_ids = {item.owner_id for item in item_list}
for owner in owner_list:
if owner.id in owner_ids:
owner.attrc = modify_funct(attrc)