@@ -107,13 +107,10 @@ def __init__(
107
107
for f in self .model .__dict__
108
108
if type (self .model .__dict__ [f ]) is InstrumentedAttribute
109
109
]
110
- self ._setup_primary_key ()
111
110
self .fields = (converter or ModelConverter ()).convert_fields_list (
112
111
fields = self .fields , model = self .model , mapper = mapper
113
112
)
114
- self .pk_field : BaseField = next (
115
- f for f in self .fields if f .name == self .pk_attr
116
- )
113
+ self ._setup_primary_key ()
117
114
self .exclude_fields_from_list = normalize_list (self .exclude_fields_from_list ) # type: ignore
118
115
self .exclude_fields_from_detail = normalize_list (self .exclude_fields_from_detail ) # type: ignore
119
116
self .exclude_fields_from_create = normalize_list (self .exclude_fields_from_create ) # type: ignore
@@ -157,16 +154,20 @@ def _setup_primary_key(self) -> None:
157
154
self ._pk_coerce = tuple (
158
155
extract_column_python_type (c ) for c in self ._pk_column
159
156
)
160
- pk_field = MultiplePKField (_pk_attrs )
161
- self .pk_attr = pk_field .name
162
- self .fields .append (pk_field ) # type: ignore[attr-defined]
157
+ self .pk_field : BaseField = MultiplePKField (_pk_attrs )
163
158
else :
164
159
assert (
165
160
len (_pk_attrs ) == 1
166
161
), f"No primary key found in model { self .model .__name__ } "
167
- self .pk_attr = _pk_attrs [0 ]
168
162
self ._pk_column = getattr (self .model , _pk_attrs [0 ])
169
163
self ._pk_coerce = extract_column_python_type (self ._pk_column ) # type: ignore[arg-type]
164
+ try :
165
+ # Try to find the primary key field among the fields
166
+ self .pk_field = next (f for f in self .fields if f .name == _pk_attrs [0 ])
167
+ except StopIteration :
168
+ # If the primary key is not among the fields, treat its value as a string
169
+ self .pk_field = StringField (_pk_attrs [0 ])
170
+ self .pk_attr = self .pk_field .name
170
171
171
172
async def handle_action (
172
173
self , request : Request , pks : List [Any ], name : str
0 commit comments