如何解决Flask Sqlalchmey - Marshmallow Nested Schema 连接过滤器 where 条件失败
我目前正在制作一个带有 get 请求的 API,以返回模型的连接 json 数据,这些数据与使用flask、sqlalchemy 和flask-sqlalchemy 以及flask-marshmallow 有关系。我在使用 while select all 时没有问题,选择特定数据但我在使用连接时有问题。任何人都可以指导我犯了什么错误。
数据库模型
class orderinfo(db.Model):
__tablename__ = 'orderinfo'
id = db.Column(db.Integer,autoincrement=True,primary_key=True)
ordernumber = db.Column(db.String,unique=True)
orderdate = db.Column(db.DateTime,nullable = False)
storage_duration = db.Column(db.String(50),nullable=False)
quantity = db.Column(db.Integer,nullable = False)
trays = db.relationship('Traydetails',backref="orderinfo",lazy='dynamic')
class Traydetails(db.Model):
__tablename__ = 'traydetails'
id= db.Column(db.Integer,primary_key=True)
traynumber = db.Column(db.String,unique=True)
orderid= db.Column(db.Integer,db.ForeignKey('orderinfo.id'))
traystatus = db.Column(db.String,nullable = False)
tests = db.relationship('Testinfo',backref="Traydetails",lazy='dynamic')
class Testinfo(db.Model):
__tablename__ = 'testinfo'
id = db.Column(db.Integer,primary_key=True)
trayid = db.Column(db.Integer,db.ForeignKey('traydetails.id'))
test_started = db.Column(db.DateTime,nullable = True)
test_ended = db.Column(db.DateTime,nullable = True)
description = db.Column(db.String,nullable = True
架构
class orderinfoSchema(ma.Schema):
class Meta:
fields =('ordernumber','orderdate','storage_duration','quantity','trays')
ordered = True
trays = fields.Nested(TraydetailsSchema,many= True)
order_schema = orderinfoSchema()
orders_schema = orderinfoSchema(many = True)
class TraydetailsSchema(ma.Schema):
class Meta:
fields = ('traynumber','traystatus','tests','description')
ordered = True
tests = fields.Nested(TestinfoSchema,many= True)
tray_schema = TraydetailsSchema()
trays_schema = TraydetailsSchema(many=True)
class TestinfoSchema(ma.Schema):
class Meta:
fields =('trayid','test_started','test_ended','description')
ordered = True
test_schema = TestinfoSchema()
tests_schema = TestinfoSchema(many = True)
数据库:
选择订单信息,托盘详细信息 来自订单信息 内部连接 Traydetails ON Traydetails.orderid = orderinfo.id where Traydetails.traystatus = 'Reserved';
我正在尝试实现上述 sql 语句,它提供了与我在 Postgres 中寻找的完全相同的结果。但是当我用棉花糖和 sqlalchmey 尝试相同的场景时,它无法删除过滤器,并且 Traydetails 中的所有数据都出现在嵌套模式中,我只想在嵌套模式中实现过滤器数据
API:
我在第一个场景中尝试了多个查询,我得到了嵌套架构中的所有数据,但未能删除过滤条件
@app.route('/traystatus/<status>',methods=['GET'])
def traystatus(status):
loaded=orderinfo.query.join(Traydetails,Traydetails.orderid==orderinfo.id).filter(Traydetails.traystatus==status).all()
result = orders_schema.dump(loaded)
return orders_schema.jsonify(result)
第二个场景显示空列表
loaded = db.session.query(orderinfo,Traydetails).join(orderinfo).filter(Traydetails.traystatus == status,Traydetails.orderid == orderinfo.id).all()
输出2:
[
{},{},{}
]
解决方法
您的查询有一个连接,因此创建了 SQLAlchemy 对象的元组。摆脱连接,只需查询通过关系和外键链接到其他表的 OrderInfo 模型(使用 PascalCase)。因此,您可以获得正确填充 Marshmallow 模式所需的所有数据。查看此线程以获得一个很好的示例: Flask Marshmallow serialize many to many relation with extra field
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。