11"""This module is a CRUD interface between resource managers and the sqlalchemy ORM"""
22import logging
3- from typing import TYPE_CHECKING , Any , Iterable , List , Optional , Tuple , Type
3+ from typing import TYPE_CHECKING , Any , Dict , Iterable , List , Optional , Tuple , Type
44
55from sqlalchemy import delete , func , select
66from sqlalchemy .exc import DBAPIError , IntegrityError , NoResultFound
3232 get_related_schema ,
3333)
3434from fastapi_jsonapi .schema_base import RelationshipInfo
35+ from fastapi_jsonapi .schema_builder import FieldConfig , TransferSaveWrapper
3536from fastapi_jsonapi .splitter import SPLIT_REL
3637from fastapi_jsonapi .utils .sqla import get_related_model_cls
3738
@@ -184,6 +185,14 @@ async def apply_relationships(self, obj: TypeModel, data_create: BaseJSONAPIItem
184185 # todo: relation name may be different?
185186 setattr (obj , relation_name , related_data )
186187
188+ def _unwrap_field_config (self , extra : Dict ):
189+ field_config_wrapper : TransferSaveWrapper = extra .get ("field_config" )
190+
191+ if field_config_wrapper :
192+ return field_config_wrapper .field_config
193+
194+ return FieldConfig ()
195+
187196 def _apply_client_generated_id (
188197 self ,
189198 data_create : BaseJSONAPIItemInSchema ,
@@ -199,8 +208,11 @@ def _apply_client_generated_id(
199208 extra = data_create .__fields__ ["id" ].field_info .extra
200209 if extra .get ("client_can_set_id" ):
201210 id_value = data_create .id
202- if cast_type := extra .get ("id_cast_func" ):
203- id_value = cast_type (id_value )
211+ field_config = self ._unwrap_field_config (extra )
212+
213+ if field_config .cast_type :
214+ id_value = field_config .cast_type (id_value )
215+
204216 model_kwargs ["id" ] = id_value
205217
206218 return model_kwargs
0 commit comments