Object Id causing error in route POST in fastAPI

62 Views Asked by At
routes:

from fastapi import APIRouter
from bson import ObjectId

from config.mongo_db import collection_user
from schemas.schemas import users_serializer
from models.model import Usuario

users_routes = APIRouter()


@users_routes.get("/")
async def get_users():
    users = users_serializer(collection_user.find())
    return {
        "status": "200",
        "data": users
    }


@users_routes.get("/{id}")
async def get_user(id: str):
    user = users_serializer(collection_user.find({"_id": ObjectId(id)}))
    return {
        "status": "200",
        "data": user
    }


@users_routes.post("/")
async def post_user(user: Usuario):
    _id = collection_user.insert_one(dict(user))
    user = users_serializer(collection_user.find({"_id": _id.inserted_id}))
    return {
        "status": "200",
        "data": user
    }

model:

from typing import List

from bson import ObjectId
from pydantic import BaseModel,  Field, BaseConfig


class OID(str):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        try:
            return ObjectId(str(v))
        except Exception:
            raise ValueError("not a valid ObjectId")


class MyBaseModel(BaseModel):
    def __hash__(self):
        return hash((type(self),) + tuple(self.__dict__.values()))


class Projects(MyBaseModel):
    id_project: ObjectId = Field(description='project id', alias='project_id')
    title: str = Field(description='titulo', alias='titulo')
    imagePath: str = Field(description='caminho da image', alias='imageUrl')
    url_project: str = Field(default='', description='caminho da image', alias='url')

    class Config(BaseConfig):
        arbitrary_types_allowed = True
        json_encoders = {
            ObjectId: lambda oid: str(oid)
        }


class Usuario(BaseModel):
    id_user: ObjectId = Field(description='user id', alias='_id')
    name: str
    login: str
    password: str
    projects: List[Projects] = Field(alias='projects')

    class Config(BaseConfig):
        arbitrary_types_allowed = True
        json_encoders = {
            ObjectId: lambda oid: str(oid)
        }

schemas:

def user_serializer(user) -> dict:
    return {
        "id": str(user["_id"]),
        "name": user["name"],
        "login": user["login"],
        "password": user["password"],
        "projects": projects_serializer(user['projects'])
    }


def users_serializer(users) -> list:
    return [user_serializer(user) for user in users]


def project_serializer(project) -> dict:
    return {
        "project_id": str(project["project_id"]),
        "title": project["titulo"],
        "imagePath": project["imageUrl"],
        "url_project": project["url"]
    }


def projects_serializer(projects) -> list:
    return [project_serializer(project) for project in projects]

Error:

line 2074, in handle_invalid_for_json_schema
    raise PydanticInvalidForJsonSchema(f'Cannot generate a JsonSchema for {error_info}')
pydantic.errors.PydanticInvalidForJsonSchema: Cannot generate a JsonSchema for core_schema.IsInstanceSchema (<class 'bson.objectid.ObjectId'>)

I dont know if this error is be caused for the list of object projects that recieve a ObjectId too or why i am passing the id in route post in wrong form.

I tried pass the project model with parameter and inserted the id this, nonetheless, don't get success in create the logic for implement.

0

There are 0 best solutions below