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.