Flask-SQLAlchemy和Flask-Restless没有取孙子

时间:2014-03-28 08:02:12

标签: python sqlalchemy flask flask-sqlalchemy flask-restless

问题

我正在Flask,Flask-SQLAlchemy和Flask-Restless上构建应用程序。我已经使用restless为父子孙子关系生成API *。我孩子的GET会正确地取孙子,但父母的GET不会为每个孩子取孙子。

*事实上,亲子关系是一个多对多但同样的前提。

模型

class Grandchild(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    parent = db.relationship('Child', backref='grandchild')

parent_child = db.Table('parent_child', 
    db.Column('parent_id', db.Integer, db.ForeignKey('parent.id')),
    db.Column('child_id', db.Integer, db.ForeignKey('child.id')),
    db.Column('number', db.SmallInteger)
)

class Child(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    grandchild_id = db.Column(db.Integer, db.ForeignKey('grandchild.id'), nullable=False)

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    children = db.relationship('Child', secondary=parent_child)

api.create_api(Child, exclude_columns=['grandchild_id'])
api.create_api(Parent)

GET:/ api / child response

{
  "num_results": 1, 
  "objects": [
    {
      "id": 1, 
      "name": "test"
      "grandchild": {
        "id": 1, 
        "name": "test"
      }
    }
  ], 
  "page": 1, 
  "total_pages": 1
}

GET:/ api / parent response

{
  "num_results": 1, 
  "objects": [
    {
      "children": [
        {
          "id": 1, 
          "name": "test", 
          "grandchild_id": 1
        }
      ],
      "id": 1, 
      "name": "test"
    }], 
  "page": 1, 
  "total_pages": 1
}

2 个答案:

答案 0 :(得分:9)

postprocessors可用于获取孙子。

def parent_post_get_many(result=None, search_params=None, **kw):
   for object in result['objects']:
      for child in object['children']:
         grandchild = Grandchild.query.get(child['grand_child_id'])
         child.update({'grandchild': grandchild})

api.create_api(Parent, postprocessors={'GET_MANY': [parent_post_get_many]})

答案 1 :(得分:2)

看了几个小时后,我会给出目前最好的答案。我已经尝试了很多方法,并且无法获得成功渲染孙子的任何东西,所以我转向烧瓶问题跟踪器,看看我能找到什么:

https://github.com/jfinkels/flask-restless/pull/222#issuecomment-31326359和@jfinkels的回复似乎表明你想要的东西目前可能在烧瓶中不可能。

假设我对问题状态的评估是正确的,您可能需要考虑围绕这个问题进行设计,或者使用不同的软件包来为您的API提供服务(可能是Flask-restful,尽管我承认我没有&#t; t使用它并且不知道它是否合适。

FWIW,我一直在使用Flask-Classy为我正在进行的项目构建一个json API。这个过程比我怀疑你想要的更多,但它也有足够的自由来更好地控制使用什么查询以及如何序列化结果。