如果我查询单个表,则可以使用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
(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
]