1

我目前正在制作一个带有 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,autoincrement=True, 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,autoincrement=True, 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)

数据:

SELECT orderinfo,Traydetails FROM orderinfo INNER JOIN Traydetails ON Traydetails.orderid = orderinfo.id where Traydetails.traystatus = 'Reserved';

我正在尝试实现上述 sql 语句,它提供了与我在 Postgres 中寻找的完全相同的结果。但是当我用棉花糖和 sqlalchmey 尝试相同的场景时,它无法删除过滤器,并且来自 Traydetails 的所有数据都出现在嵌套模式中,我只想在嵌套模式中实现过滤器数据

接口:

我在第一个场景中尝试了多个查询我得到了嵌套模式中的所有数据,但无法删除过滤条件

@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:

[
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}, 
  {}
]
4

1 回答 1

1

您的查询有一个连接,因此会创建 SQLAlchemy 对象的元组。摆脱连接,只需查询通过关系和外键链接到其他表的 OrderInfo 模型(使用 PascalCase)。因此,您可以获得正确填充 Marshmallow 模式所需的所有数据。查看此线程以获取一个很好的示例: Flask Marshmallow serialize many to many relationship with extra field

于 2021-06-11T12:41:38.803 回答