Код: Выделить всё
from typing import Any
from bson import ObjectId
from pydantic_core import core_schema
class PyObjectId(ObjectId):
"""To create a pydantic Object that validates bson ObjectID"""
@classmethod
def __get_pydantic_core_schema__(cls, _source_type: Any, _handler: Any) -> core_schema.CoreSchema:
return core_schema.json_or_python_schema(
json_schema=core_schema.str_schema(),
python_schema=core_schema.union_schema(
[
core_schema.is_instance_schema(ObjectId),
core_schema.chain_schema(
[
core_schema.str_schema(),
core_schema.no_info_plain_validator_function(cls.validate),
]
),
]
),
serialization=core_schema.plain_serializer_function_ser_schema(lambda x: str(x)), # noqa W0108
)
@classmethod
def validate(cls, value) -> ObjectId:
if not ObjectId.is_valid(value):
raise ValueError("Invalid ObjectId")
return ObjectId(value)
class GoalRecordStored(BaseModel):
"""Goal Record Model."""
player_id: PyObjectId = Field(..., validation_alias="Player ID")
date: datetime = Field(validation_alias="Date")
Я пытаюсь отправить player_id как ObjectId, но не могу этого сделать, и он сохраняется в MongoDB как строку, а не ObjectId. Как я могу это изменить?
Я пробовал много изменений в классе, но это не помогло. Я пытался передать player_id разными способами, но он всегда сохранялся в виде строки, а не так, как мне хотелось.
Подробнее здесь: https://stackoverflow.com/questions/787 ... to-mongodb