|
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 |
@@ -411,35 +411,33 @@ def is_supported_type(cls, value: Any) -> TypeGuard[type[T]]: |
411 | 411 | return _is_pydantic_v1_model(value) or _is_pydantic_v2_model(value) |
412 | 412 |
|
413 | 413 | @classmethod |
| 414 | + @cache_model_fields |
414 | 415 | def get_model_fields(cls) -> list["FieldMeta"]: |
415 | 416 | """Retrieve a list of fields from the factory's model. |
416 | 417 |
|
417 | 418 |
|
418 | 419 | :returns: A list of field MetaData instances. |
419 | 420 |
|
420 | 421 | """ |
421 | | - if "_fields_metadata" not in cls.__dict__: |
422 | | - if _is_pydantic_v1_model(cls.__model__): |
423 | | - cls._fields_metadata = [ |
424 | | - PydanticFieldMeta.from_model_field( |
425 | | - field, |
426 | | - use_alias=not cls.__model__.__config__.allow_population_by_field_name, # type: ignore[attr-defined] |
427 | | - ) |
428 | | - for field in cls.__model__.__fields__.values() |
429 | | - ] |
430 | | - else: |
431 | | - use_alias = cls.__model__.model_config.get("validate_by_name", False) or cls.__model__.model_config.get( |
432 | | - "populate_by_name", False |
| 422 | + if _is_pydantic_v1_model(cls.__model__): |
| 423 | + return [ |
| 424 | + PydanticFieldMeta.from_model_field( |
| 425 | + field, |
| 426 | + use_alias=not cls.__model__.__config__.allow_population_by_field_name, # type: ignore[attr-defined] |
433 | 427 | ) |
434 | | - cls._fields_metadata = [ |
435 | | - PydanticFieldMeta.from_field_info( |
436 | | - field_info=field_info, |
437 | | - field_name=field_name, |
438 | | - use_alias=not use_alias, |
439 | | - ) |
440 | | - for field_name, field_info in cls.__model__.model_fields.items() # pyright: ignore[reportGeneralTypeIssues] |
441 | | - ] |
442 | | - return cls._fields_metadata |
| 428 | + for field in cls.__model__.__fields__.values() |
| 429 | + ] |
| 430 | + use_alias = cls.__model__.model_config.get("validate_by_name", False) or cls.__model__.model_config.get( |
| 431 | + "populate_by_name", False |
| 432 | + ) |
| 433 | + return [ |
| 434 | + PydanticFieldMeta.from_field_info( |
| 435 | + field_info=field_info, |
| 436 | + field_name=field_name, |
| 437 | + use_alias=not use_alias, |
| 438 | + ) |
| 439 | + for field_name, field_info in cls.__model__.model_fields.items() # pyright: ignore[reportGeneralTypeIssues] |
| 440 | + ] |
443 | 441 |
|
444 | 442 | @classmethod |
445 | 443 | def get_constrained_field_value( |
|
0 commit comments