return 来自 SQLalchemy Flask 中连接 table 的填充字段

return populated fields from a join table in SQLalchemy Flask

UserService 是连接 table 用户和服务 table 的联接。我有一个查询 returns 所有具有 user_id = 到路由中传递的 id 的 tables。

@bp.route('/user/<id>/services', methods=['GET'])
def get_services_from_user(id):
    user = db_session.query(User).filter(id == User.id).first()

    if not user:
        return jsonify({'Message': f'User with id: {id} does not exist', 'Status': 404})

    user_services = db_session.query(UserService).filter(user.id == UserService.user_id).all()
    result = user_services_schema.dump(user_services)

    for service in result:
        user_service = db_session.query(Service).filter(service['service_id'] == Service.id).all()
        result = services_schema.dump(user_service)
        return jsonify(result)

结果包含一个如下所示的列表:

[
    {
        "id": 1,
        "service_id": 1,
        "user_id": 1
    },
    {
        "id": 2,
        "service_id": 2,
        "user_id": 1
    }
]

然后我如何继续此查询或添加另一个查询以获取所有实际填充的服务(服务 class),而不仅仅是 service_id 和 return 所有这些服务一个列表? for 循环是我的尝试,但目前失败了。我只返回一个包含一个填充服务的列表,而不是第二个。

您可以尝试这样的操作:

userServies = db_session.query(Users, Services).filter(Users.id == Services.id).all()

userServices 将是一个可迭代对象。你应该使用: for value, index in userServices: 遍历它。 (可能是 index, value 我不是 100% 确定订单)

还有另一种方法,使用 .join() 并使用 .add_columns() 添加您需要的列。
还有另一种方法使用

db_session.query(Users.id, Services.id, ... 'all the columns that you need' ...).filter(Users.id == Services.id).all()