Flask-SQLAlchemy和Flask-Restless不提取孙子 [英] Flask-SQLAlchemy and Flask-Restless not fetching grandchildren
本文介绍了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
{
pre
num_results:1,
objects:[
{
id:1,
name:test
grandchild:{
id:1,
name:test
$ b $
page:1,
total_pages:1
}
$ bGET:/ api / parent response
{
num_results:1,
objects:[
{
children:[
{
id:1,
name:test,
grandchild_id:1
}
],
id:1,
name:test
}],
page:1,
total_pages:1
}
解决方案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屋!
查看全文