如何在 flask_sqlalchemy 中查询嵌套数据中的数据
how to query data inside nested data in flask_sqlalchemy
我在这里使用 flask_marshmallow 来显示我对前端的 json 响应,
我table喜欢下面的
class PostImgList(db.Model):
__tablename__ = 'boat_img_list'
id = db.Column(db.Integer, primary_key=True)
link = db.Column(db.Text, nullable=False)
main = db.Column(db.Boolean, default=False)
boat_id = db.Column(db.Integer, db.ForeignKey("boat.id"))
class Post(db.Model):
__tablename__ = 'boat'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(200))
seat_capacity = db.Column(db.Integer)
img_list = db.relationship(PostImgList, backref='boat', lazy=True)
我可以通过以下方式获取全部数据:
class PostImgListSchema(ma.ModelSchema):
class Meta:
model = PostImgList
class PostSchemaClass(ma.Schema):
class Meta:
fields = ('id', 'name', 'seat_capacity', 'img_list')
img_list = ma.Nested(PostImgListSchema, many=True, only='link')
schema = PostSchemaClass(many=True)
data = Post.query.all()
data = schema.dump(data).data
return data
前端可以得到如下数据
"data": [
{
"seat_capacity": 1,
"id": 1,
"name": "mantapt",
"img_list": [
"fffadweda",
"fffadweda",
"fffadweda",
"fffadweda",
"fffadweda"
]
},
{
"seat_capacity": 10,
"id": 2,
"name": "keren",
"img_list": [
"fffadweda"
]
}
]
我知道它是用 many=True
在 PostImgListSchema
中设置的,我只想在一个结果中使用带有查询过滤器的嵌套模式的一些数据,所以我必须设置 many=False
对于 PostImgListSchema
?
那么,如何写 PostImgListSchema
schema ?
我只是想用过滤器 main field value
显示我的 PostImgList
的位置,即 True
,就像下面这样:
"data": [
{
"seat_capacity": 1,
"id": 1,
"name": "mantapt",
"img_list": "fffadweda"
},
{
"seat_capacity": 10,
"id": 2,
"name": "keren",
"img_list": "fffadweda"
}
]
谢谢 :)
将 primaryjoin 或 secondaryjoin(指定您的连接条件)与 uselist=False 结合使用应该可以解决问题(有关详细信息,请参阅 here)。
已解决!!!
我只是在 class 模型 Post
中创建了一个属性
class Post(db.Model):
...
...
@property
def image(self):
img = PostImgList.query.filter_by(main=True).first()
if not img:
return ""
return img.link
我在这里使用 flask_marshmallow 来显示我对前端的 json 响应,
我table喜欢下面的
class PostImgList(db.Model):
__tablename__ = 'boat_img_list'
id = db.Column(db.Integer, primary_key=True)
link = db.Column(db.Text, nullable=False)
main = db.Column(db.Boolean, default=False)
boat_id = db.Column(db.Integer, db.ForeignKey("boat.id"))
class Post(db.Model):
__tablename__ = 'boat'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(200))
seat_capacity = db.Column(db.Integer)
img_list = db.relationship(PostImgList, backref='boat', lazy=True)
我可以通过以下方式获取全部数据:
class PostImgListSchema(ma.ModelSchema):
class Meta:
model = PostImgList
class PostSchemaClass(ma.Schema):
class Meta:
fields = ('id', 'name', 'seat_capacity', 'img_list')
img_list = ma.Nested(PostImgListSchema, many=True, only='link')
schema = PostSchemaClass(many=True)
data = Post.query.all()
data = schema.dump(data).data
return data
前端可以得到如下数据
"data": [
{
"seat_capacity": 1,
"id": 1,
"name": "mantapt",
"img_list": [
"fffadweda",
"fffadweda",
"fffadweda",
"fffadweda",
"fffadweda"
]
},
{
"seat_capacity": 10,
"id": 2,
"name": "keren",
"img_list": [
"fffadweda"
]
}
]
我知道它是用 many=True
在 PostImgListSchema
中设置的,我只想在一个结果中使用带有查询过滤器的嵌套模式的一些数据,所以我必须设置 many=False
对于 PostImgListSchema
?
那么,如何写 PostImgListSchema
schema ?
我只是想用过滤器 main field value
显示我的 PostImgList
的位置,即 True
,就像下面这样:
"data": [
{
"seat_capacity": 1,
"id": 1,
"name": "mantapt",
"img_list": "fffadweda"
},
{
"seat_capacity": 10,
"id": 2,
"name": "keren",
"img_list": "fffadweda"
}
]
谢谢 :)
将 primaryjoin 或 secondaryjoin(指定您的连接条件)与 uselist=False 结合使用应该可以解决问题(有关详细信息,请参阅 here)。
已解决!!!
我只是在 class 模型 Post
class Post(db.Model):
...
...
@property
def image(self):
img = PostImgList.query.filter_by(main=True).first()
if not img:
return ""
return img.link