从五个从上到下的相关表创建JSON

时间:2017-08-26 13:33:11

标签: python json database

我们运行的应用程序高度依赖于位置。所以,我们有五个模型:国家,省,区,部门,小区和村庄:

我想要的是生成一个代表它们的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"
        }
    ]

     }

  ]

1 个答案:

答案 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注入攻击或错误。大多数模块都可以使用绑定参数构建查询字符串,这些参数可以自动安全地转义查询字符串中的变量。