fix __all__ error in exclude, update docs
This commit is contained in:
@ -14,7 +14,6 @@ from typing import (
|
||||
|
||||
from ormar.models.excludable import ExcludableItems
|
||||
from ormar.models.mixins.relation_mixin import RelationMixin
|
||||
from ormar.queryset.utils import translate_list_to_dict, update
|
||||
|
||||
if TYPE_CHECKING: # pragma no cover
|
||||
from ormar import Model
|
||||
@ -138,9 +137,7 @@ class ExcludableMixin(RelationMixin):
|
||||
return columns
|
||||
|
||||
@classmethod
|
||||
def _update_excluded_with_related(
|
||||
cls, exclude: Union["AbstractSetIntStr", "MappingIntStrAny", None],
|
||||
) -> Union[Set, Dict]:
|
||||
def _update_excluded_with_related(cls, exclude: Union[Set, Dict, None],) -> Set:
|
||||
"""
|
||||
Used during generation of the dict().
|
||||
To avoid cyclical references and max recurrence limit nested models have to
|
||||
@ -151,8 +148,6 @@ class ExcludableMixin(RelationMixin):
|
||||
|
||||
:param exclude: set/dict with fields to exclude
|
||||
:type exclude: Union[Set, Dict, None]
|
||||
:param nested: flag setting nested models (child of previous one, not main one)
|
||||
:type nested: bool
|
||||
:return: set or dict with excluded fields added.
|
||||
:rtype: Union[Set, Dict]
|
||||
"""
|
||||
@ -160,10 +155,11 @@ class ExcludableMixin(RelationMixin):
|
||||
related_set = cls.extract_related_names()
|
||||
if isinstance(exclude, set):
|
||||
exclude = {s for s in exclude}
|
||||
exclude.union(related_set)
|
||||
else:
|
||||
related_dict = translate_list_to_dict(related_set)
|
||||
exclude = update(related_dict, exclude)
|
||||
exclude = exclude.union(related_set)
|
||||
elif isinstance(exclude, dict):
|
||||
# relations are handled in ormar - take only own fields (ellipsis in dict)
|
||||
exclude = {k for k, v in exclude.items() if v is Ellipsis}
|
||||
exclude = exclude.union(related_set)
|
||||
return exclude
|
||||
|
||||
@classmethod
|
||||
|
||||
@ -222,9 +222,7 @@ class SavePrepareMixin(RelationMixin, AliasMixin):
|
||||
|
||||
@staticmethod
|
||||
async def _upsert_through_model(
|
||||
instance: "Model",
|
||||
previous_model: "Model",
|
||||
relation_field: "ForeignKeyField",
|
||||
instance: "Model", previous_model: "Model", relation_field: "ForeignKeyField",
|
||||
) -> None:
|
||||
"""
|
||||
Upsert through model for m2m relation.
|
||||
|
||||
@ -514,7 +514,11 @@ class NewBaseModel(pydantic.BaseModel, ModelTableProxy, metaclass=ModelMetaclass
|
||||
fields = [
|
||||
field
|
||||
for field in fields
|
||||
if field not in exclude or exclude.get(field) is not Ellipsis
|
||||
if field not in exclude
|
||||
or (
|
||||
exclude.get(field) is not Ellipsis
|
||||
and exclude.get(field) != {"__all__"}
|
||||
)
|
||||
]
|
||||
return fields
|
||||
|
||||
@ -567,6 +571,18 @@ class NewBaseModel(pydantic.BaseModel, ModelTableProxy, metaclass=ModelMetaclass
|
||||
result = self.get_child(items, key)
|
||||
return result if result is not Ellipsis else default_return
|
||||
|
||||
def _convert_all(self, items: Union[Set, Dict, None]) -> Union[Set, Dict, None]:
|
||||
"""
|
||||
Helper to convert __all__ pydantic special index to ormar which does not
|
||||
support index based exclusions.
|
||||
|
||||
:param items: current include/exclude value
|
||||
:type items: Union[Set, Dict, None]
|
||||
"""
|
||||
if isinstance(items, dict) and "__all__" in items:
|
||||
return items.get("__all__")
|
||||
return items
|
||||
|
||||
def _extract_nested_models( # noqa: CCR001
|
||||
self,
|
||||
relation_map: Dict,
|
||||
@ -603,8 +619,8 @@ class NewBaseModel(pydantic.BaseModel, ModelTableProxy, metaclass=ModelMetaclass
|
||||
relation_map, field, default_return=dict()
|
||||
),
|
||||
models=nested_model,
|
||||
include=self._skip_ellipsis(include, field),
|
||||
exclude=self._skip_ellipsis(exclude, field),
|
||||
include=self._convert_all(self._skip_ellipsis(include, field)),
|
||||
exclude=self._convert_all(self._skip_ellipsis(exclude, field)),
|
||||
)
|
||||
elif nested_model is not None:
|
||||
|
||||
@ -612,8 +628,8 @@ class NewBaseModel(pydantic.BaseModel, ModelTableProxy, metaclass=ModelMetaclass
|
||||
relation_map=self._skip_ellipsis(
|
||||
relation_map, field, default_return=dict()
|
||||
),
|
||||
include=self._skip_ellipsis(include, field),
|
||||
exclude=self._skip_ellipsis(exclude, field),
|
||||
include=self._convert_all(self._skip_ellipsis(include, field)),
|
||||
exclude=self._convert_all(self._skip_ellipsis(exclude, field)),
|
||||
)
|
||||
else:
|
||||
dict_instance[field] = None
|
||||
|
||||
Reference in New Issue
Block a user