from pydantic import BaseModel, Field, EmailStr from typing import Optional from datetime import datetime from bson import ObjectId 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 User(BaseModel): id: PyObjectId = Field(default_factory=PyObjectId, alias="_id") email: EmailStr username: str hashed_password: str is_active: bool = True created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) class Config: allow_population_by_field_name = True arbitrary_types_allowed = True json_encoders = {ObjectId: str} class UserInDB(User): pass