我正在实现一个 FastAPI 服务器,允许在 MongoDB 中上传/下载文件以及其他字段。
我的 Pydantic 模型是(简化的):
PyObjectId = Annotated[str, BeforeValidator(str)]
class Form(BaseModel):
id: Optional[PyObjectId] = Field(alias="_id", default=None)
is_attachment: bool = Field(...)
content_type: str = Field(...)
file_name: str = Field(...)
file_data: Binary = Field(...)
model_config = ConfigDict(
arbitrary_types_allowed=True,
json_schema_extra={
"example": {
"file_name": "file.pdf",
"is_attachment": True,
"content_type": "application/pdf",
"file_data": "JVBERi0xLjQK...",
}
},
)
我有一个简单的 GET 返回上述模型对象的列表:
class FormCollection(BaseModel):
forms: List[Form]
@app.get("/forms/", response_description="List all forms", response_model=FormCollection, response_model_by_alias=False,)
async def list_forms():
return FormCollection(forms=await forms_collection.find().to_list(1000))
我运行服务器,但是当打开 OpenAPI (Swagger) 页面时,我得到:
pydantic.errors.PydanticInvalidForJsonSchema: Cannot generate a JsonSchema for core_schema.IsInstanceSchema (<class 'bson.binary.Binary'>)
Pydantic 似乎不喜欢“file_data”二进制字段。问题是,如何在 Pydantic 中定义 bson.binary.Binary 字段。
找到答案,我需要使用“字节”Pydantic 数据类型。