From 18659d0a20c0f63dc94ff042a1e6ed42f2c3fe7e Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Fri, 8 Nov 2024 16:53:48 -0800 Subject: [PATCH] Conditionally import BaseModel to handle older pydantic v1 versions --- reflex/state.py | 9 ++++-- reflex/utils/serializers.py | 56 ++++++++++++++++++++++++------------- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/reflex/state.py b/reflex/state.py index ebf958734..ddbaf3cb5 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -39,8 +39,6 @@ from typing import ( get_type_hints, ) -from pydantic import BaseModel as BaseModelV2 -from pydantic.v1 import BaseModel as BaseModelV1 from sqlalchemy.orm import DeclarativeBase from typing_extensions import Self @@ -63,6 +61,13 @@ try: except ModuleNotFoundError: import pydantic +from pydantic import BaseModel as BaseModelV2 + +try: + from pydantic.v1 import BaseModel as BaseModelV1 +except ModuleNotFoundError: + BaseModelV1 = BaseModelV2 + import wrapt from redis.asyncio import Redis from redis.exceptions import ResponseError diff --git a/reflex/utils/serializers.py b/reflex/utils/serializers.py index 18a7eb671..d40d7c957 100644 --- a/reflex/utils/serializers.py +++ b/reflex/utils/serializers.py @@ -24,9 +24,6 @@ from typing import ( overload, ) -from pydantic import BaseModel as BaseModelV2 -from pydantic.v1 import BaseModel as BaseModelV1 - from reflex.base import Base from reflex.constants.colors import Color, format_color from reflex.utils import types @@ -269,24 +266,12 @@ def serialize_base(value: Base) -> dict: return {k: v for k, v in value.dict().items() if not callable(v)} -@serializer(to=dict) -def serialize_base_model_v1(model: BaseModelV1) -> dict: - """Serialize a pydantic v1 BaseModel instance. - - Args: - model: The BaseModel to serialize. - - Returns: - The serialized BaseModel. - """ - return model.dict() - - -if BaseModelV2 is not BaseModelV1: +try: + from pydantic.v1 import BaseModel as BaseModelV1 @serializer(to=dict) - def serialize_base_model_v2(model: BaseModelV2) -> dict: - """Serialize a pydantic v2 BaseModel instance. + def serialize_base_model_v1(model: BaseModelV1) -> dict: + """Serialize a pydantic v1 BaseModel instance. Args: model: The BaseModel to serialize. @@ -294,7 +279,38 @@ if BaseModelV2 is not BaseModelV1: Returns: The serialized BaseModel. """ - return model.model_dump() + return model.dict() + + from pydantic import BaseModel as BaseModelV2 + + if BaseModelV1 is not BaseModelV2: + + @serializer(to=dict) + def serialize_base_model_v2(model: BaseModelV2) -> dict: + """Serialize a pydantic v2 BaseModel instance. + + Args: + model: The BaseModel to serialize. + + Returns: + The serialized BaseModel. + """ + return model.model_dump() +except ImportError: + # Older pydantic v1 import + from pydantic import BaseModel as BaseModelV1 + + @serializer(to=dict) + def serialize_base_model_v1(model: BaseModelV1) -> dict: + """Serialize a pydantic v1 BaseModel instance. + + Args: + model: The BaseModel to serialize. + + Returns: + The serialized BaseModel. + """ + return model.dict() @serializer