|
3 | 3 | import builtins |
4 | 4 | import ipaddress |
5 | 5 | import uuid |
| 6 | +import warnings |
6 | 7 | import weakref |
7 | 8 | from collections.abc import Mapping, Sequence, Set |
8 | 9 | from datetime import date, datetime, time, timedelta |
@@ -214,6 +215,7 @@ def Field( |
214 | 215 | exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
215 | 216 | include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
216 | 217 | const: Optional[bool] = None, |
| 218 | + coerce_numbers_to_str: Optional[bool] = None, |
217 | 219 | gt: Optional[float] = None, |
218 | 220 | ge: Optional[float] = None, |
219 | 221 | lt: Optional[float] = None, |
@@ -257,6 +259,7 @@ def Field( |
257 | 259 | exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
258 | 260 | include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
259 | 261 | const: Optional[bool] = None, |
| 262 | + coerce_numbers_to_str: Optional[bool] = None, |
260 | 263 | gt: Optional[float] = None, |
261 | 264 | ge: Optional[float] = None, |
262 | 265 | lt: Optional[float] = None, |
@@ -309,6 +312,7 @@ def Field( |
309 | 312 | exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
310 | 313 | include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
311 | 314 | const: Optional[bool] = None, |
| 315 | + coerce_numbers_to_str: Optional[bool] = None, |
312 | 316 | gt: Optional[float] = None, |
313 | 317 | ge: Optional[float] = None, |
314 | 318 | lt: Optional[float] = None, |
@@ -342,6 +346,7 @@ def Field( |
342 | 346 | exclude: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
343 | 347 | include: Union[Set[Union[int, str]], Mapping[Union[int, str], Any], Any] = None, |
344 | 348 | const: Optional[bool] = None, |
| 349 | + coerce_numbers_to_str: Optional[bool] = None, |
345 | 350 | gt: Optional[float] = None, |
346 | 351 | ge: Optional[float] = None, |
347 | 352 | lt: Optional[float] = None, |
@@ -371,16 +376,26 @@ def Field( |
371 | 376 | schema_extra: Optional[dict[str, Any]] = None, |
372 | 377 | ) -> Any: |
373 | 378 | current_schema_extra = schema_extra or {} |
| 379 | + |
| 380 | + for param_name in ("coerce_numbers_to_str",): |
| 381 | + if param_name in current_schema_extra: |
| 382 | + msg = f"Pass `{param_name}` parameter directly to Field instead of passing it via `schema_extra`" |
| 383 | + warnings.warn(msg, UserWarning, stacklevel=2) |
| 384 | + |
374 | 385 | # Extract possible alias settings from schema_extra so we can control precedence |
375 | 386 | schema_validation_alias = current_schema_extra.pop("validation_alias", None) |
376 | 387 | schema_serialization_alias = current_schema_extra.pop("serialization_alias", None) |
| 388 | + current_coerce_numbers_to_str = coerce_numbers_to_str or current_schema_extra.pop( |
| 389 | + "coerce_numbers_to_str", None |
| 390 | + ) |
377 | 391 | field_info_kwargs = { |
378 | 392 | "alias": alias, |
379 | 393 | "title": title, |
380 | 394 | "description": description, |
381 | 395 | "exclude": exclude, |
382 | 396 | "include": include, |
383 | 397 | "const": const, |
| 398 | + "coerce_numbers_to_str": current_coerce_numbers_to_str, |
384 | 399 | "gt": gt, |
385 | 400 | "ge": ge, |
386 | 401 | "lt": lt, |
|
0 commit comments