Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 18 additions & 17 deletions tortoise/fields/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@

parse_datetime = functools.partial(parse_date, default_timezone=None)

try:
from pydantic import BaseModel as _PydanticBaseModel
from pydantic._internal._model_construction import ModelMetaclass as _PydanticModelMetaclass
except ImportError:
_PydanticBaseModel = None # type: ignore[assignment,misc]
_PydanticModelMetaclass = None # type: ignore[assignment,misc]

if TYPE_CHECKING: # pragma: nocoverage
from tortoise.models import Model

Expand Down Expand Up @@ -767,13 +774,8 @@ def to_db_value(
return value.decode()
return value

try:
from pydantic import BaseModel

if isinstance(value, BaseModel):
value = value.model_dump()
except ImportError:
pass
if _PydanticBaseModel is not None and isinstance(value, _PydanticBaseModel):
value = value.model_dump()

return self.encoder(value)

Expand All @@ -783,21 +785,20 @@ def to_python_value(
if isinstance(value, (str, bytes)):
try:
data = self.decoder(value)

try:
from pydantic._internal._model_construction import ModelMetaclass

if isinstance(self.field_type, ModelMetaclass) and not isinstance(data, list):
return self.field_type(**data)
except ImportError:
pass

return data
except Exception:
raise FieldError(
f"Value {value if isinstance(value, str) else value.decode()} is invalid json value."
)

if (
_PydanticModelMetaclass is not None
and isinstance(self.field_type, _PydanticModelMetaclass)
and not isinstance(data, list)
):
return self.field_type(**data)

return data

return value


Expand Down