我们运行的应用程序高度依赖于位置。所以,我们有五个模型:国家,省,区,部门,小区和村庄:
我想要的是生成一个代表它们的JSON。我尝试过的很长,但我注意到,由于结构相同,模块的一大块会显示我的问题。
因此,每个小区内都可以有多个村庄:
cells=database.bring('SELECT id,name FROM batteries_cell WHERE sector_id=' + str(sectorID))
if cells:
for cell in cells:
cellID=cell[0]
cellName=cell[1]
cell_pro={'id':cellID,'name':cellName,'villages':{}}
villages=database.bring('SELECT id,name FROM batteries_village WHERE cell_id=' + str(cellID))
if villages:
for village in villages:
villageID=village[0]
villageName=village[1]
village_pro={'id':villageID, 'name':villageName}
cell_pro['villages'].update(village_pro)
但是,更新只存储每个单元格的最后一个村庄。不知道我做错了什么,因为我一直在尝试并删除不同的方法来结束相同的结果。
UPDATE所需的输出是:
[
{
"id": 1,
"name": "Ethiopia",
"villages": [{
"vid": 1,
"vname": "one"
},
{
"vid": 2,
"vname": "village two"
}
]
},
{
"id": 2,
"name": "Sene",
"villages": [{
"vid": 3,
"vname": "third"
},
{
"vid": 4,
"vname": "fourth"
}
]
}
]
答案 0 :(得分:1)
更新会一直覆盖cell_pro村庄字典中的相同密钥。例如,如果village_pro为{'id':'1','name':'A'},则cell_pro['villages'].update(village_pro)
将设置cell_pro['villages']['id'] = '1'
和cell_pro['villages']['name'] = 'A'
。循环中的下一个村庄将用其他内容覆盖id和name。
您可能要么将cell_pro ['villages']放入列表中,要么将其保存为dict并添加由id键入的村庄:
cell_pro['villages'][villageID] = village_pro
您希望生成的JSON采用什么格式?也许你只是想要:
cell_pro['villages'][villageID] = villageName
为编写的问题加入了期望的JSON:
在JSON中,村庄在一个阵列中。为此,我们在Python中使用一个列表。请注意,cell_pro['villages']
现在是一个列表,我们使用append()
添加到其中。
cells=database.bring('SELECT id,name FROM batteries_cell WHERE sector_id=' + str(sectorID))
if cells:
for cell in cells:
cellID=cell[0]
cellName=cell[1]
cell_pro={'id':cellID,'name':cellName,'villages':[]}
villages=database.bring('SELECT id,name FROM batteries_village WHERE cell_id=' + str(cellID))
if villages:
for village in villages:
villageID=village[0]
villageName=village[1]
village_pro={'vid':villageID, 'vname':villageName}
cell_pro['villages'].append(village_pro)
提示:我不知道你正在使用什么数据库访问模块,但是通常不好的做法是构建类似的SQL查询,因为参数可能无法正确转义并可能导致SQL注入攻击或错误。大多数模块都可以使用绑定参数构建查询字符串,这些参数可以自动安全地转义查询字符串中的变量。