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