Fastapi автоматически сериализует ObjectId из mongodb ⇐ Python

Программы на Python
Anonymous
Fastapi автоматически сериализует ObjectId из mongodb

Сообщение Anonymous »

Я использую FastAPI с MongoDB. Я хочу, чтобы мой бэкэнд отвечал на простой запрос на домен/items/ со списком из базы данных Mongodb.
Сначала я расширяю класс 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}
затем я определяю метод get, определяющий возвращаемую модель:

Код: Выделить всё

@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)
Однако, если я попытаюсь выполнить запрос GET, возникнет исключение из строки, возвращающей JSONResponse:

Код: Выделить всё

TypeError: Object of type 'ObjectId' is not JSON serializable
Прежде всего, я не понимаю, в чем разница между json_encoders = {PyObjectId: str, ObjectId: str в конфигурации модели Item и field_schema.update(type="string") в методе PyObjectId __modify_schema__(). Нужны ли нам оба? И почему?
Во-вторых, я не понимаю, почему поле ObjectId каждого элемента не преобразуется в строку автоматически. Что я упускаю или делаю неправильно?
ПРИМЕЧАНИЕ: я знаю, что могу просто перебирать элементы, возвращаемые Mongodb, преобразуя их в dict и преобразуя их '_id' в строку, но мне бы хотелось, чтобы FastAPI и Pydantic делали это автоматически.

Подробнее здесь: https://stackoverflow.com/questions/769 ... om-mongodb

Вернуться в «Python»