目标:
我正在尝试迭代嵌套字典的副本(基于简单的JSON模式),以为代表团队及其成员的Web服务器请求构建单个JSON有效负载。
每个有效负载均来自循环外的字典,其中包含团队作为键,而其用户的ID作为值。
问题:
我能够成功复制源词典并创建包括其第一个成员的团队词典,但是在列表的第二次迭代中添加其他成员时,第一个成员将被覆盖,而不是将第二个成员添加到字典有效负载中
这是我第一次使用嵌套词典,因此任何提示将不胜感激。
# source dictionary
teams_dict = {'Boston':['1234','5678'],
'Atlanta':['9876','4321']}
# schema to be modified
payload_schema = {"data":
{"id":None,"type":"teams","attributes":
{"name":None},"relationships":
{"members":{"data":[{"id":None,"type":"users"}]}}}}
# loop
for team, members in teams_dict.items():
team_load = deepcopy(payload_schema)
team_load['data']['attributes']['name']=team
#print(f"Now creating team {team}")
for member in members:
team_load['data']['relationships']['members']['data'][0]['id']=member
team_load['data']['relationships']['members']['data'][0]['type']='users'
print(team_load)
#print(f"Added user id {member} to payload")
由于第一个成员被覆盖,我最终得到的有效载荷仅包含第二个成员:
print(team_load)
{{'data': {'id': None, 'type': 'teams', 'attributes': {'name': 'Atlanta'}, 'relationships': {'members': {'data': [{'id': '4321', 'type': 'users'}]}}}}
理想情况下,它看起来像这样:
print(team_load)
{'data': {'id': None, 'type': 'teams', 'attributes': {'name':'Atlanta'}, 'relationships': {'members': {'data': [{'id': '9876','type': 'users'},{'id': '4321','type': 'users'}]}}}}
答案 0 :(得分:1)
问题是您总是使用以下命令来写入索引0:
team_load['data']['relationships']['members']['data'][0]['id']=member
team_load['data']['relationships']['members']['data'][0]['type']='users'
这是一个列表:
team_load['data']['relationships']['members']['data']
,因此您每次都需要附加到它。
由于您正在处理嵌套对象,因此我将使成员信息成为另一个对象,并将其从有效载荷架构中删除:
payload_schema = {"data":
{"id":None,"type":"teams","attributes":
{"name":None},"relationships":
{"members":{"data":[]}}}}
member_schema = {"id":None,"type":"users"}
然后进入内循环:
for member in members:
member_load = deepcopy(member_schema)
member_load['id']=member
team_load['data']['relationships']['members']['data'].append(member_load)
print(team_load)
您无需将类型设置为“用户”,因为已经在架构中进行了设置,但是您可以根据需要将其设置为其他值。
希望这会有所帮助!