2015-05-21 224 views
2

我使用量瓶中,用以下模型:如何从数据库中的树数据结构创建一个json对象?

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"} 
      ]} 
     ] 
+0

请包括你已经尝试了什么。它工作吗? –

回答

3

我使用了一个查询数据库,并返回JSON称为Flask-Restless库。它使用SQLAlchemy。

如果你不想集成这样的东西,你可以继承你的SQLAlchemy模型,并运行to_json()方法。

class NewsCategory(db.Model, JsonSerializer)

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 

信用:Github Overholt project(瓶,安全的作者)

+0

我有和上面相同的用例,所以我尝试了这种方法,作为'NewsCategory()。to_json()',但得到了一个空字典,如'{'title':None,'id':None,'parent_id ':无,'children':[]}'......我已经证实数据也在底层表中。我有一种感觉,我对'to_json()'方法的调用是不正确的。 –

+0

@horcle_buzz这个方法是为了在现有的对象上使用 - 你试图在空对象上使用它吗? news_cat = NewsCategory.query.filter_by(name ='Technology')。first() news_cat_json = news_cat.to_json() 希望这有助于澄清。 –

+1

嗨。我实际上使用Marshmallow库中的嵌套方案解决了我的问题。实施起来非常简单。是的,该对象确实存在为SQLAlchemy对象。 –

相关问题