FastAPI:如何从请求中获取JSON文件并保存

hec6srdp  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(244)
@router.get("/products", tags=["Product"], response_model=list[schemas.Product])
def get_all_product(db: Session = Depends(get_db)):
    return get_products(db)

def get_products(db: Session):
    products = db.query(models.Product).all()
    return products

上面的代码运行良好,当我进入localhost:5000/products时,我得到了一个JSON文件。
我想将该JSON文件保存到我的计算机上,但是下面的代码返回了一个错误:

def get_all_product(db: Session = Depends(get_db)):
    with open('save_products.json', 'w', encoding = 'utf-8' ) as fp:
        json.dump(get_products(db), fp)
    return get_products(db)

TypeError:Product类型的对象不是JSON可序列化的。
我知道我必须使我的'Product'类可序列化,但似乎FastAPI本身已经可以做到这一点(否则我不会通过我的请求获得JSON文件)。

amrnrhlw

amrnrhlw1#

要将SQLAlchemy对象的列表转换为它们的Pydantic表示形式(这是FastAPI在返回它们时在内部执行的操作),可以使用Pydantic中的实用函数parse_obj_as

products = parse_obj_as(List[schemas.Product], get_products(db))

products现在将是Pydantic Product对象的列表,而不是SQLAlchemy,并且这些对象可以通过Pydantics的常规序列化支持转换为dict:

list_of_product_dicts = [product.dict() for product in products])

然后可以使用json.dump序列化此列表:

json.dump(list_of_product_dicts)

相关问题