Python 如何从数据库中的树数据结构创建json对象?

Python 如何从数据库中的树数据结构创建json对象?,python,json,flask,sqlalchemy,uinavigationbar,Python,Json,Flask,Sqlalchemy,Uinavigationbar,我使用的烧瓶型号如下: class NewsCategory(db.Model): __tablename__ = 'news_category' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(64)) parent_id = db.Column(db.Integer, db.ForeignKey('news_category.id')) children

我使用的烧瓶型号如下:

class NewsCategory(db.Model):
    __tablename__ = 'news_category'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64))
    parent_id = db.Column(db.Integer, db.ForeignKey('news_category.id'))
    children = db.relationship("NewsCategory")
我想从这个模型中创建一个json对象,用于导航菜单

我想递归地解析它,并构建一个层次化JSON对象,如下所示:

tree = [{"title": "Node 1", "id": "1"},
         {"title": "Folder 2", "id": "2", "folder": "true", "children": [
            {"title": "Node 2.1", "id": "3"},
            {"title": "Node 2.2", "id": "4"}
          ]}
        ]
我使用一个名为的库来查询数据库并返回json。它是为配合SQLAlchemy而设计的

如果您不想与这样的东西集成,那么可以对SQLAlchemy模型进行子类化,并在其上运行to_json()方法

class新闻类别(db.Model,JsonSerializer)


信贷:(Flask Security的作者)

请包括您尝试过的内容。它有效吗?我有与上面相同的用例,所以我尝试了
newscapection().to_json()
,但得到了一个空字典,如
{'title':None,'id':None,'parent_id':None,'children':[]}
。。。我已经验证了数据也在基础表中。我感觉我对
to_json()
方法的调用不正确。@horcle\u buzz此方法用于现有对象--您是否试图在空对象上使用它?news\u cat=newscape.query.filter\u by(name='Technology').first()news\u cat\u json=news\u cat.to\u json()希望这有助于澄清.Hi。实际上,我使用棉花糖库中提供的嵌套方案解决了我的问题。实现起来非常简单。是的,该对象确实作为SQLAlchemy对象存在。
class JsonSerializer(object):
    """A mixin that can be used to mark a SQLAlchemy model class which
    implements a :func:`to_json` method. The :func:`to_json` method is used
    in conjuction with the custom :class:`JSONEncoder` class. By default this
    mixin will assume all properties of the SQLAlchemy model are to be visible
    in the JSON output. Extend this class to customize which properties are
    public, hidden or modified before being being passed to the JSON serializer.
    """

    __json_public__ = None
    __json_hidden__ = None
    __json_modifiers__ = None

    def get_field_names(self):
        for p in self.__mapper__.iterate_properties:
            yield p.key

    def to_json(self):
        field_names = self.get_field_names()

        public = self.__json_public__ or field_names
        hidden = self.__json_hidden__ or []
        modifiers = self.__json_modifiers__ or dict()

        rv = dict()
        for key in public:
            rv[key] = getattr(self, key)
        for key, modifier in modifiers.items():
            value = getattr(self, key)
            rv[key] = modifier(value, self)
        for key in hidden:
            rv.pop(key, None)
        return rv