1

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 の回答に基づいて、次を作成します。

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
4

1 に答える 1

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)
于 2014-03-20T15:36:31.437 に答える