如何添加flask sqlalchemy多表格结果,并将列名称和值添加到列表中(与jsonify一起使用)

问题描述 投票:0回答:1

如果我查询单个表,则可以使用getAttr来获得所需的结果

department = Department.query.filter(Department.id==id).first()
dept={c.name: str(getattr(department, c.name)) for c in department.__table__.columns}
return jsonify(dept)

我如何在多桌查询结果中获得相同的状态?

评估您要为结果集中的每一行返回单个

dict

(或JSON对象),所需的只是为每个
python flask flask-sqlalchemy
1个回答
0
投票
行中的每个实体生成一个

(Department, Supplier)

,然后将它们合并。但是,我们需要考虑这些模型可能会共享一些属性名称,这些名称必须被歧义。
可以通过根据您的代码创建一个函数来处理歧义,该函数接受前缀字符串和实体,并返回一个前缀的属性名称和值:
dict
可以这样使用:

def to_prefix_dict(prefix, entity): if not entity: return {} return { f'{prefix.lower()}_{c.name}': getattr(entity, c.name) for c in entity.__table__.columns }

在经过

import functools import sqlalchemy as sa ... # This code is vanilla SQLAlchemy, but Flask-SQLAlchemy code will be # essentially the same: substitute `db.session.query` for `sa.select` and # `db.session` for `s`. with Session() as s: q = sa.select(Department, Supplier).outerjoin( Supplier, Department.default_supplier_id == Supplier.id ) rs = s.execute(q) result = [ functools.reduce( dict.__or__, [to_prefix_dict(key, entity) for key, entity in zip(rs.keys(), row)], ) for row in rs ]
时,在这样的结构中进行了反应,假设一个部门与供应商一起,没有:

jsonify

在线,此功能可以用来返回嵌套行结构,如果JSON的消费者需要单独处理部门和供应商,则可能有用:

[ { "department_id": 1, "department_name": "D1", "department_default_supplier_id": 1, "supplier_id": 1, "supplier_name": "S1" }, { "department_id": 2, "department_name": "S2", "department_default_supplier_id": null } ]

就像以下:

def to_dict(entity):
    if not entity:
        return {}
    return {c.name: getattr(entity, c.name) for c in entity.__table__.columns}

以此结果:

...
    result = [
        {key_name: to_dict(entity) for key_name, entity in zip(rs.keys(), row)}
        for row in rs
    ]

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.