提问者:小点点

在FastApi中切换到路由器并不顺利。response_modelList[]pydant字段类型错误


我有一个使用FastApi的Python 3.8应用程序。< code>main.py中的路由越来越多,所以我采用了从FastApi application对象切换到< code>router的方法,并将每个db表的路由放在自己的文件中。到目前为止,由于对< code>response_model装饰器的解释,它还没有工作。

开关导致我修改后的代码与response_model装饰器Post有麻烦。最大的区别是我使用的是router装饰器,而不是main中的应用程序装饰器。

我得到的具体错误是:

 File "/Users/markwardell/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/fastapi/utils.py", line 67, in create_response_field
    raise fastapi.exceptions.FastAPIError(
fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that typing.List[models.Post] is a valid pydantic field type

导致此错误的代码在post.py中,我从main.py

post.py

从fastapi导入HTTPException,从sqlalchemy导入APIRouter。form import Session从fastapi键入import List。params导入依赖

import models
from database import get_db

router: APIRouter = APIRouter()


@router.get("/postss", response_model=List[models.Post])
def get_post(db: Session = Depends(get_db)):
    # cursor.execute("""SELECT * FROM posts""")
    # posts = cursor.fetchall()
    # print(posts)

    try:
        posts = db.query(models.Post).all()
    except Exception as ex:
        msg = f"Unexpected {ex=}, {type(ex)=}"
        raise HTTPException(status_code=500, detail=msg)
    return posts

工作的原始代码:

main.py

从Fastapi导入FastAPI、响应、HTTP异常从fastapi.params导入取决于从starlette导入状态导入用户导入帖子

import models
import schemas
from database import engine, get_db
from sqlalchemy.orm import Session

models.Base.metadata.create_all(bind=engine)


app = FastAPI()
app.include_router(user.router)
app.include_router(post.router)

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)


@app.get("/")
async def root():
    return {"message": "Welcome To My Api!"}


@app.get("/posts", response_model=List[schemas.Post])
def get_posts(db: Session = Depends(get_db)):
    # cursor.execute("""SELECT * FROM posts""")
    # posts = cursor.fetchall()
    # print(posts)

    try:
        posts = db.query(models.Post).all()
    except Exception as ex:
        msg = f"Unexpected {ex=}, {type(ex)=}"
        raise HTTPException(status_code=500, detail=msg)
    return posts

以下是response_model的定义

schema.py

from datetime import datetime

from pydantic import BaseModel, EmailStr


class PostBase(BaseModel):
    title: str
    content: str
    published: bool = True


class PostCreate(BaseModel):
    pass


class Post(PostBase):
    id: int
    created_at: datetime

    class Config:
        orm_mode = True
        arbitrary_types_allowed = True


class UserCreate(BaseModel):
    email: EmailStr
    password: str


class UserOut(BaseModel):
    id: int
    email: EmailStr
    created_at: datetime

    class Config:
        orm_mode = True

共1个答案

匿名用户

response_model定义中的类类型错误;引用应该指向您的模式(它继承自pydantic的BaseModel)-您的response_model指向您的SQLAlchemy模型(即模块名称中的schemavsmodel)。