From 686548cbb1c94bca44cc46726298c46f5ed8e949 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Mon, 11 Nov 2024 16:14:08 -0800 Subject: [PATCH] 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. --- reflex/state.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/reflex/state.py b/reflex/state.py index 66b1e3cab..b255661c2 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -46,6 +46,7 @@ from reflex import event from reflex.config import get_config from reflex.istate.data import RouterData from reflex.istate.storage import ClientStorageBase +from reflex.model import Model from reflex.vars.base import ( ComputedVar, DynamicRouteVar, @@ -1733,15 +1734,20 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): if value is None: continue hinted_args = value_inside_optional(hinted_args) - if ( - isinstance(value, dict) - and inspect.isclass(hinted_args) - and ( - dataclasses.is_dataclass(hinted_args) - or issubclass(hinted_args, Base) - ) - ): - payload[arg] = hinted_args(**value) + if isinstance(value, dict) and inspect.isclass(hinted_args): + if issubclass(hinted_args, Model): + # Remove non-fields from the payload + payload[arg] = hinted_args( + **{ + key: value + for key, value in value.items() + if key in hinted_args.__fields__ + } + ) + 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): payload[arg] = set(value) if isinstance(value, list) and (