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

Программы на 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проблемы FastAPI с MongoDB - TypeError: объект ObjectId не повторяется
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как получить ObjectId вставленного документа в реактивной Java MongoDB?
    Anonymous » » в форуме JAVA
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Невозможно десериализовать строку из BsonType ObjectId в MongoDb C#
    Anonymous » » в форуме C#
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Использовать ObjectId.GenerateNewId() или оставить MongoDB для его создания?
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Spring data mongodb создает ObjectId при сохранении и String _id при обновлении.
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous

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