尝试返回账单列表



新的快速API,无法找到我做错的地方

这是我的路由器-

@router.get('/{user_id}/salesbill', response_model=list[schemas.ShowSalesBill], status_code=status.HTTP_200_OK)
def get_all_salesbills(user_id: int, db: Session = Depends(get_db)):
objs = db.query(bill_model.SalesBillModel).filter(bill_model.SalesBillModel.user_id==user_id)
print(objs, "=================")
return objs

这是我的schema——

class BillBase(BaseModel):
bill_no: int
amount: int
about: str

class ShowSalesBill(BillBase):
id: int
class Config:
orm_mode = True

这是我的模型-


class SalesBillModel(Base):
__tablename__ = "salesbill"
id = Column(Integer, primary_key=True, index=True)
bill_no = Column(Integer, index=True)
amount = Column(Integer, nullable=False)
about = Column(String(50), nullable=True)
user_id = Column(Integer, ForeignKey("users.id", ondelete='CASCADE'))
user = relationship("User", back_populates="salesbills")

因此,我试图获取用户添加的所有账单,但得到一个错误

pydantic.error_wrappers。ValidationError: ShowSalesBill的1个验证错误响应值不是一个有效的列表(type=type_error.list)

得到这个错误

SELECT salesbill.id AS salesbill_id, salesbill.bill_no AS salesbill_bill_no, salesbill.amount AS salesbill_amount, salesbill.about AS salesbill_about, salesbill.user_id AS salesbill_user_id 
FROM salesbill 
WHERE salesbill.user_id = ? =================
INFO:     127.0.0.1:47410 - "GET /1/salesbill HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
File "/home/mdhv/fastapi/env/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 419, in run_asgi
result = await app(  # type: ignore[func-returns-value]

来理解错误:您正在放入的响应模型需要一个List

模式。ShowSalesBill您返回的结果与预期的不一样。

我建议你把id添加到BillBase

class BillBase(BaseModel):
id : int
bill_no: int
amount: int
about: str

,然后创建一个迂腐的模型,该模型具有包含BillBase列表的列:

class ShowSalesBill(BaseModel):
bill_list: Optional[list[BillBase]] = []
class Config:
orm_mode = True

那么你的端点就变成了这样

@router.get('/{user_id}/salesbill', response_model=schemas.ShowSalesBill, status_code=status.HTTP_200_OK)
def get_all_salesbills(user_id: int, db: Session = Depends(get_db)):
objs = db.query(bill_model.SalesBillModel).filter(bill_model.SalesBillModel.user_id==user_id).all()
return schemas.ShowSalesBill(
bill_list=[schemas.BillBase(**bill.__dict__) for bill in objs]    
)

我希望它有帮助!

最新更新