Metaclass used by ormar Models that performs configuration and build of ormar Models. Sets pydantic configuration. Extract model_fields and convert them to pydantic FieldInfo, updates class namespace. Extracts settings and fields from parent classe
( # type: ignore # noqa: CCR001
mcs: "ModelMetaclass",
name: str,
bases: Any,
attrs: dict,
__pydantic_generic_metadata__: Union[PydanticGenericMetadata, None] = None,
__pydantic_reset_parent_namespace__: bool = True,
_create_model_module: Union[str, None] = None,
**kwargs,
)
| 658 | |
| 659 | class ModelMetaclass(pydantic._internal._model_construction.ModelMetaclass): |
| 660 | def __new__( # type: ignore # noqa: CCR001 |
| 661 | mcs: "ModelMetaclass", |
| 662 | name: str, |
| 663 | bases: Any, |
| 664 | attrs: dict, |
| 665 | __pydantic_generic_metadata__: Union[PydanticGenericMetadata, None] = None, |
| 666 | __pydantic_reset_parent_namespace__: bool = True, |
| 667 | _create_model_module: Union[str, None] = None, |
| 668 | **kwargs, |
| 669 | ) -> type: |
| 670 | """ |
| 671 | Metaclass used by ormar Models that performs configuration |
| 672 | and build of ormar Models. |
| 673 | |
| 674 | |
| 675 | Sets pydantic configuration. |
| 676 | Extract model_fields and convert them to pydantic FieldInfo, |
| 677 | updates class namespace. |
| 678 | |
| 679 | Extracts settings and fields from parent classes. |
| 680 | Fetches methods decorated with @computed_field decorator |
| 681 | to expose them later in dict(). |
| 682 | |
| 683 | Construct parent pydantic Metaclass/ Model. |
| 684 | |
| 685 | If class has ormar_config declared (so actual ormar Models) it also: |
| 686 | |
| 687 | * populate sqlalchemy columns, pkname and tables from model_fields |
| 688 | * register reverse relationships on related models |
| 689 | * registers all relations in alias manager that populates table_prefixes |
| 690 | * exposes alias manager on each Model |
| 691 | * creates QuerySet for each model and exposes it on a class |
| 692 | * sets custom serializers for relation models |
| 693 | |
| 694 | :param name: name of current class |
| 695 | :type name: str |
| 696 | :param bases: base classes |
| 697 | :type bases: tuple |
| 698 | :param attrs: class namespace |
| 699 | :type attrs: dict |
| 700 | """ |
| 701 | merge_or_generate_pydantic_config(attrs=attrs, name=name) |
| 702 | attrs["__name__"] = name |
| 703 | attrs, model_fields = extract_annotations_and_default_vals(attrs) |
| 704 | for base in reversed(bases): |
| 705 | mod = base.__module__ |
| 706 | if mod.startswith("ormar.models.") or mod.startswith("pydantic."): |
| 707 | continue |
| 708 | attrs, model_fields = extract_from_parents_definition( |
| 709 | base_class=base, curr_class=mcs, attrs=attrs, model_fields=model_fields |
| 710 | ) |
| 711 | if "ormar_config" in attrs: |
| 712 | attrs["model_config"]["ignored_types"] = (OrmarConfig,) |
| 713 | attrs["model_config"]["from_attributes"] = True |
| 714 | for field_name, field in model_fields.items(): |
| 715 | if field.is_relation: |
| 716 | decorator = field_serializer( |
| 717 | field_name, mode="wrap", check_fields=False |
no test coverage detected