Сначала я расширяю класс Mongodb ObjectId для преобразования в строку с помощью FastAPI, и определите мою модель Item, указав в ее конфигурации, что типы ObjectId и PyObjectId должны быть преобразованы в строку:
Код: Выделить всё
class PyObjectId(ObjectId):
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v):
if not ObjectId.is_valid(v):
raise ValueError("Invalid objectid")
return ObjectId(v)
@classmethod
def __modify_schema__(cls, field_schema):
field_schema.update(type="string")
class Item(BaseModel):
mongo_id: PyObjectId = Field(default_factory=PyObjectId, alias='_id')
name: str
class Config:
allow_population_by_field_name = True
json_encoders = {PyObjectId: str, ObjectId: str}
Код: Выделить всё
@app.get("/items/", response_model=List[Item])
async def list_items(skip: int = 0, limit: int = 0):
"""List all items in the database"""
items = await ITEMS.find(skip=skip, limit=limit).to_list(MAX_TO_LIST)
return JSONResponse(status_code=status.HTTP_200_OK, content=items)
Код: Выделить всё
TypeError: Object of type 'ObjectId' is not JSON serializable
Во-вторых, я не понимаю, почему поле ObjectId каждого элемента не преобразуется в строку автоматически. Что я упускаю или делаю неправильно?
ПРИМЕЧАНИЕ: я знаю, что могу просто перебирать элементы, возвращаемые Mongodb, преобразуя их в dict и преобразуя их '_id' в строку, но мне бы хотелось, чтобы FastAPI и Pydantic делали это автоматически.
Подробнее здесь: https://stackoverflow.com/questions/769 ... om-mongodb