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