Flask-SQLAlchemy和Flask-Restless不提取孙子 [英] Flask-SQLAlchemy and Flask-Restless not fetching grandchildren

查看:192
本文介绍了Flask-SQLAlchemy和Flask-Restless不提取孙子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题



我在Flask,Flask-SQLAlchemy和Flask-Restless上构建一个应用程序。我已经不安地为父子孙关系*生成一个API。我孩子的GET会正确地取得孙子,但父母的GET不会为每个孩子取孙子。实际上,亲子关系是多对多的,但是同样的前提。

模型



  class Grandchild(db.Model):
id = db.Column(db.Integer,primary_key = True)
name = db.Column(db.String,nullable = False)
$ b $ 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)

$ b $ 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父类(db.Model):
id = db.Column db.teger,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(父)



GET:/ api / child response



  {
num_results:1,
objects:[
{
id:1,
name:test
grandchild:{
id:1,
name:test

$ b $
page:1,
total_pages:1
}
pre
$ b

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
}


解决方案

  def parent_post_get_many(result = None,search_params =没有,** kw):
在结果['objects']中的对象:
在对象['children']中的子元素:
grandchild = Grandchild.query.get(child [ (父',后处理器= {'GET_MANY':[parent_post_get_many]})
($'$')
child.update({'grandchild':grandchild})

api.create_api


Problem

I am building an app on Flask, Flask-SQLAlchemy, and Flask-Restless. I have used restless to generate an API for a parent-child-grandchild relationship*. A GET on my child will correctly fetch the grandchild, but a GET on the parent will not fetch the grandchild for each child.

*In fact, the parent-child relationship is a many-to-many, but same premise.

Models

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
}

解决方案

postprocessors can be used to fetch grandchild.

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]})

这篇关于Flask-SQLAlchemy和Flask-Restless不提取孙子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆