diff --git a/ormar/models/model_row.py b/ormar/models/model_row.py index e3cf6ec2e..4c70fa54a 100644 --- a/ormar/models/model_row.py +++ b/ormar/models/model_row.py @@ -98,10 +98,12 @@ def from_row( # noqa: CFQ002 instance: Optional["Model"] = None if item.get(cls.Meta.pkname, None) is not None: - item["__excluded__"] = cls.get_names_to_exclude( + excluded_fields = cls.get_names_to_exclude( excludable=excludable, alias=table_prefix ) - instance = cast("Model", cls(**item)) + instance = cast( + "Model", cls.construct(**item, _excluded_fields=excluded_fields) + ) instance.set_save_status(True) return instance diff --git a/ormar/models/newbasemodel.py b/ormar/models/newbasemodel.py index 5ea20986e..0ab05e521 100644 --- a/ormar/models/newbasemodel.py +++ b/ormar/models/newbasemodel.py @@ -825,18 +825,23 @@ def json( # type: ignore # noqa A003 @classmethod def construct( - cls: Type["T"], _fields_set: Optional["SetStr"] = None, **values: Any + cls: Type["T"], + _fields_set: Optional["SetStr"] = None, + _excluded_fields: Optional["SetStr"] = None, + **values: Any, ) -> "T": + for field_to_nullify in _excluded_fields or []: + values[field_to_nullify] = None own_values = { k: v for k, v in values.items() if k not in cls.extract_related_names() } model = cls.__new__(cls) fields_values: Dict[str, Any] = {} - for name, field in cls.__fields__.items(): + for name, field_to_nullify in cls.__fields__.items(): if name in own_values: fields_values[name] = own_values[name] - elif not field.required: - fields_values[name] = field.get_default() + elif not field_to_nullify.required: + fields_values[name] = field_to_nullify.get_default() fields_values.update(own_values) object.__setattr__(model, "__dict__", fields_values) model._initialize_internal_attributes() diff --git a/tests/test_model_definition/test_pydantic_fields.py b/tests/test_model_definition/test_pydantic_fields.py index 12d575379..01558bc0b 100644 --- a/tests/test_model_definition/test_pydantic_fields.py +++ b/tests/test_model_definition/test_pydantic_fields.py @@ -65,6 +65,12 @@ def __init__(self, **kwargs): kwargs["pydantic_test"] = PydanticTest(aa="random", bb=42) super().__init__(**kwargs) + @classmethod + def construct(cls, **kwargs): + kwargs["number"] = get_number() + kwargs["pydantic_test"] = PydanticTest(aa="random", bb=42) + return super().construct(**kwargs) + id: int = ormar.Integer(primary_key=True) name: str = ormar.String(max_length=200) url: HttpUrl = "https://www.example3.com" # type: ignore