(
*,
self_instance: _TSQLModel,
values: dict[str, Any],
_fields_set: set[str] | None = None,
)
| 206 | |
| 207 | |
| 208 | def sqlmodel_table_construct( |
| 209 | *, |
| 210 | self_instance: _TSQLModel, |
| 211 | values: dict[str, Any], |
| 212 | _fields_set: set[str] | None = None, |
| 213 | ) -> _TSQLModel: |
| 214 | # Copy from Pydantic's BaseModel.construct() |
| 215 | # Ref: https://github.com/pydantic/pydantic/blob/v2.5.2/pydantic/main.py#L198 |
| 216 | # Modified to not include everything, only the model fields, and to |
| 217 | # set relationships |
| 218 | # SQLModel override to get class SQLAlchemy __dict__ attributes and |
| 219 | # set them back in after creating the object |
| 220 | # new_obj = cls.__new__(cls) |
| 221 | cls = type(self_instance) |
| 222 | old_dict = self_instance.__dict__.copy() |
| 223 | # End SQLModel override |
| 224 | |
| 225 | fields_values: dict[str, Any] = {} |
| 226 | defaults: dict[ |
| 227 | str, Any |
| 228 | ] = {} # keeping this separate from `fields_values` helps us compute `_fields_set` |
| 229 | for name, field in cls.model_fields.items(): |
| 230 | if field.alias and field.alias in values: |
| 231 | fields_values[name] = values.pop(field.alias) |
| 232 | elif name in values: |
| 233 | fields_values[name] = values.pop(name) |
| 234 | elif not field.is_required(): |
| 235 | defaults[name] = field.get_default(call_default_factory=True) |
| 236 | if _fields_set is None: |
| 237 | _fields_set = set(fields_values.keys()) |
| 238 | fields_values.update(defaults) |
| 239 | |
| 240 | _extra: dict[str, Any] | None = None |
| 241 | if cls.model_config.get("extra") == "allow": |
| 242 | _extra = {} |
| 243 | for k, v in values.items(): |
| 244 | _extra[k] = v |
| 245 | # SQLModel override, do not include everything, only the model fields |
| 246 | # else: |
| 247 | # fields_values.update(values) |
| 248 | # End SQLModel override |
| 249 | # SQLModel override |
| 250 | # Do not set __dict__, instead use setattr to trigger SQLAlchemy |
| 251 | # object.__setattr__(new_obj, "__dict__", fields_values) |
| 252 | # instrumentation |
| 253 | for key, value in {**old_dict, **fields_values}.items(): |
| 254 | setattr(self_instance, key, value) |
| 255 | # End SQLModel override |
| 256 | object.__setattr__(self_instance, "__pydantic_fields_set__", _fields_set) |
| 257 | if not cls.__pydantic_root_model__: |
| 258 | object.__setattr__(self_instance, "__pydantic_extra__", _extra) |
| 259 | |
| 260 | if cls.__pydantic_post_init__: |
| 261 | self_instance.model_post_init(None) |
| 262 | elif not cls.__pydantic_root_model__: |
| 263 | # Note: if there are any private attributes, cls.__pydantic_post_init__ would exist |
| 264 | # Since it doesn't, that means that `__pydantic_private__` should be set to None |
| 265 | object.__setattr__(self_instance, "__pydantic_private__", None) |
no test coverage detected
searching dependent graphs…