|
12 | 12 | from typing_extensions import Literal, get_args |
13 | 13 |
|
14 | 14 | from polyfactory.exceptions import MissingDependencyException |
15 | | -from polyfactory.factories.base import BaseFactory, BuildContext |
| 15 | +from polyfactory.factories.base import BaseFactory, BuildContext, cache_model_fields |
16 | 16 | from polyfactory.factories.base import BuildContext as BaseBuildContext |
17 | 17 | from polyfactory.field_meta import Constraints, FieldMeta, Null |
18 | 18 | from polyfactory.utils.helpers import unwrap_new_type, unwrap_optional |
@@ -407,35 +407,33 @@ def is_supported_type(cls, value: Any) -> TypeGuard[type[T]]: |
407 | 407 | return _is_pydantic_v1_model(value) or _is_pydantic_v2_model(value) |
408 | 408 |
|
409 | 409 | @classmethod |
| 410 | + @cache_model_fields |
410 | 411 | def get_model_fields(cls) -> list["FieldMeta"]: |
411 | 412 | """Retrieve a list of fields from the factory's model. |
412 | 413 |
|
413 | 414 |
|
414 | 415 | :returns: A list of field MetaData instances. |
415 | 416 |
|
416 | 417 | """ |
417 | | - if "_fields_metadata" not in cls.__dict__: |
418 | | - if _is_pydantic_v1_model(cls.__model__): |
419 | | - cls._fields_metadata = [ |
420 | | - PydanticFieldMeta.from_model_field( |
421 | | - field, |
422 | | - use_alias=not cls.__model__.__config__.allow_population_by_field_name, # type: ignore[attr-defined] |
423 | | - ) |
424 | | - for field in cls.__model__.__fields__.values() |
425 | | - ] |
426 | | - else: |
427 | | - use_alias = cls.__model__.model_config.get("validate_by_name", False) or cls.__model__.model_config.get( |
428 | | - "populate_by_name", False |
| 418 | + if _is_pydantic_v1_model(cls.__model__): |
| 419 | + return [ |
| 420 | + PydanticFieldMeta.from_model_field( |
| 421 | + field, |
| 422 | + use_alias=not cls.__model__.__config__.allow_population_by_field_name, # type: ignore[attr-defined] |
429 | 423 | ) |
430 | | - cls._fields_metadata = [ |
431 | | - PydanticFieldMeta.from_field_info( |
432 | | - field_info=field_info, |
433 | | - field_name=field_name, |
434 | | - use_alias=not use_alias, |
435 | | - ) |
436 | | - for field_name, field_info in cls.__model__.model_fields.items() # pyright: ignore[reportGeneralTypeIssues] |
437 | | - ] |
438 | | - return cls._fields_metadata |
| 424 | + for field in cls.__model__.__fields__.values() |
| 425 | + ] |
| 426 | + use_alias = cls.__model__.model_config.get("validate_by_name", False) or cls.__model__.model_config.get( |
| 427 | + "populate_by_name", False |
| 428 | + ) |
| 429 | + return [ |
| 430 | + PydanticFieldMeta.from_field_info( |
| 431 | + field_info=field_info, |
| 432 | + field_name=field_name, |
| 433 | + use_alias=not use_alias, |
| 434 | + ) |
| 435 | + for field_name, field_info in cls.__model__.model_fields.items() # pyright: ignore[reportGeneralTypeIssues] |
| 436 | + ] |
439 | 437 |
|
440 | 438 | @classmethod |
441 | 439 | def get_constrained_field_value( |
|
0 commit comments