Only pass Model.__fields__ when casting event args (#4356)

Attempting to initialize relationship fields in a sqlmodel model throws an
error, so only pass defined pydantic __fields__ if the type is a Model.
This commit is contained in:
Masen Furer 2024-11-11 16:14:08 -08:00 committed by GitHub
parent 35c8afd8c8
commit 686548cbb1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -46,6 +46,7 @@ from reflex import event
from reflex.config import get_config from reflex.config import get_config
from reflex.istate.data import RouterData from reflex.istate.data import RouterData
from reflex.istate.storage import ClientStorageBase from reflex.istate.storage import ClientStorageBase
from reflex.model import Model
from reflex.vars.base import ( from reflex.vars.base import (
ComputedVar, ComputedVar,
DynamicRouteVar, DynamicRouteVar,
@ -1733,15 +1734,20 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
if value is None: if value is None:
continue continue
hinted_args = value_inside_optional(hinted_args) hinted_args = value_inside_optional(hinted_args)
if ( if isinstance(value, dict) and inspect.isclass(hinted_args):
isinstance(value, dict) if issubclass(hinted_args, Model):
and inspect.isclass(hinted_args) # Remove non-fields from the payload
and ( payload[arg] = hinted_args(
dataclasses.is_dataclass(hinted_args) **{
or issubclass(hinted_args, Base) key: value
) for key, value in value.items()
): if key in hinted_args.__fields__
payload[arg] = hinted_args(**value) }
)
elif dataclasses.is_dataclass(hinted_args) or issubclass(
hinted_args, Base
):
payload[arg] = hinted_args(**value)
if isinstance(value, list) and (hinted_args is set or hinted_args is Set): if isinstance(value, list) and (hinted_args is set or hinted_args is Set):
payload[arg] = set(value) payload[arg] = set(value)
if isinstance(value, list) and ( if isinstance(value, list) and (