【问题标题】:How to create a json tree structure from SQLalchemy model如何从 SQLalchemy 模型创建 json 树结构
【发布时间】:2014-03-20 13:34:17
【问题描述】:

我正在尝试使用 Flask 创建 Web 服务,我的 Web 服务需要返回属于配置文件的所有活动的 json 编码树结构。

我的模特:

class Activity(db.Model):
    __tablename__ = 'activity'
    id = db.Column(db.Integer, primary_key=True)
    profile_id = db.Column(db.String, db.ForeignKey('profile.id'), nullable=False, index=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('activity.id'), index=True)
    name = db.Column(db.String)

    parent = db.relationship('Activiteit', remote_side=[id], backref='children')

class Profile(db.Model):
    __tablename__ = 'profile'
    id = db.Column(db.Integer, primary_key=True)
    profile_name = db.Column(db.String(64))
    active = db.Column(db.Boolean, nullable=False)

    activities = db.relationship('Activity', backref="profile", lazy='dynamic')
    employees = db.relationship('Employee', backref="profile", lazy='dynamic')

我需要以下结构:

Main activity 1
     Sub activity 1
     Sub activity 2
         Subsub activity 1
Main activity 2
etc. etc.

我尝试创建嵌套字典和字典列表,但每次我都卡住了。最终作为 1 级元素的 3 级元素或仅返回 2 级的树。

经过一番搜索,我发现我需要创建一个带有节点的队列,其中包含一个名称和一个子节点列表,然后将节点添加到树中。

我使用以下函数创建了队列:

def get(self, profile_id):
    profile = models.Profile.query.get(profile_id)
    queue = {}
    for activity in profile.activities:
        queue[activity.name]= [c.name for c in activity.children]

现在我不知道如何进行,或者我是否走在正确的道路上。任何帮助将不胜感激

编辑

基于Codegeek's 的答案,我创建了以下内容:

def get(self, profile_id):
    activities = models.Activity.query.filter_by(profile_id=profile_id).all()
    tree = {}
    for level1 in activities:
        if level1.parent_id is None:
            tree[level1.name] = {'id': level1.id}
            for level2 in level1.children:
                tree[level1.name][level2.name] = {'id': level2.id}
                for level3 in level2.children:
                    tree[level1.name][level2.name][level3.name] = {'id': level3.id}
    return tree

【问题讨论】:

  • flask.jsonify() 不起作用?
  • 好吧,我的结构不对,所以还没有尝试转换为 JSON,但我相信 flask-restful 模块有一个内置的 .jsonify() 函数

标签: python json flask flask-sqlalchemy flask-restful


【解决方案1】:

您尝试过使用flask.jsonify() 吗?

jsonify() 将字典作为参数。您可以尝试创建嵌套字典。在您的情况下,它是 3 个级别,可能如下所示:

d= { 'Activity': { 'Subactivity': { 'Subsubactivity': 'value }}}

您尚未在创建字典的位置共享代码,但您可以执行以下操作(当然我使用的是通用名称)

d = {}
for activity in Activities:
    for subactivity in activity:
        for subsubactivity in subactivity:
            d['Activity']['Subactivity']['subsubactivity'] = value

然后您可以将 JSON 返回为:

return flask.jsonify(**d)

【讨论】:

  • 感谢您的输入,但我的问题是我不知道如何创建字典。我有一个包含活动对象的列表,并希望将其构建为嵌套字典。
  • 好的,然后发布更多代码,可能有人可以看看您的活动对象列表是如何创建的?
  • @codegeek 您的解决方案仅适用于 3 个级别。您能否建议遍历动态树结构的解决方案,其中任何分支中的级别数都不相同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2019-08-20
  • 2015-01-27
  • 1970-01-01
  • 2011-11-16
  • 2018-11-27
相关资源
最近更新 更多