From 36300f90569b18cb560537bb168de97ed1b18b8a Mon Sep 17 00:00:00 2001 From: collerek Date: Mon, 26 Oct 2020 14:50:04 +0100 Subject: [PATCH] refactor translating of aliases from queryset to modelproxy --- .coverage | Bin 53248 -> 0 bytes .gitignore | 1 + ormar/models/model.py | 4 ++-- ormar/models/modelproxy.py | 18 ++++++++++++++++++ ormar/queryset/queryset.py | 22 +++------------------- tests/test_models.py | 3 ++- 6 files changed, 26 insertions(+), 22 deletions(-) delete mode 100644 .coverage diff --git a/.coverage b/.coverage deleted file mode 100644 index a5c0d9f8600790e0c9b3a198fa799cd7b76e1475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 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 diff --git a/.gitignore b/.gitignore index cf175d2..fb0cf92 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ p38venv .idea .pytest_cache .mypy_cache +.coverage *.pyc *.log test.db diff --git a/ormar/models/model.py b/ormar/models/model.py index 3805a00..eaf4935 100644 --- a/ormar/models/model.py +++ b/ormar/models/model.py @@ -145,7 +145,7 @@ class Model(NewBaseModel): self_fields = self._extract_model_db_fields() self_fields.pop(self.get_column_name_from_alias(self.Meta.pkname)) - self_fields = self.objects._translate_columns_to_aliases(self_fields) + self_fields = self.translate_columns_to_aliases(self_fields) expr = self.Meta.table.update().values(**self_fields) expr = expr.where(self.pk_column == getattr(self, self.Meta.pkname)) @@ -166,6 +166,6 @@ class Model(NewBaseModel): "Instance was deleted from database and cannot be refreshed" ) kwargs = dict(row) - kwargs = self.objects._translate_aliases_to_columns(kwargs) + kwargs = self.translate_aliases_to_columns(kwargs) self.from_dict(kwargs) return self diff --git a/ormar/models/modelproxy.py b/ormar/models/modelproxy.py index 760232d..61d9bc8 100644 --- a/ormar/models/modelproxy.py +++ b/ormar/models/modelproxy.py @@ -140,6 +140,24 @@ class ModelTableProxy: ) return to_field + @classmethod + def translate_columns_to_aliases(cls, new_kwargs: dict) -> dict: + for field_name, field in cls.Meta.model_fields.items(): + if ( + field_name in new_kwargs + and field.name is not None + and field.name != field_name + ): + new_kwargs[field.name] = new_kwargs.pop(field_name) + return new_kwargs + + @classmethod + def translate_aliases_to_columns(cls, new_kwargs: dict) -> dict: + for field_name, field in cls.Meta.model_fields.items(): + if field.name in new_kwargs and field.name != field_name: + new_kwargs[field_name] = new_kwargs.pop(field.name) + return new_kwargs + @classmethod def merge_instances_list(cls, result_rows: List["Model"]) -> List["Model"]: merged_rows: List["Model"] = [] diff --git a/ormar/queryset/queryset.py b/ormar/queryset/queryset.py index df1bc01..a6c6b26 100644 --- a/ormar/queryset/queryset.py +++ b/ormar/queryset/queryset.py @@ -74,7 +74,7 @@ class QuerySet: new_kwargs = self._remove_pk_from_kwargs(new_kwargs) new_kwargs = self.model.substitute_models_with_pks(new_kwargs) new_kwargs = self._populate_default_values(new_kwargs) - new_kwargs = self._translate_columns_to_aliases(new_kwargs) + new_kwargs = self.model.translate_columns_to_aliases(new_kwargs) return new_kwargs def _populate_default_values(self, new_kwargs: dict) -> dict: @@ -83,22 +83,6 @@ class QuerySet: new_kwargs[field_name] = field.get_default() return new_kwargs - def _translate_columns_to_aliases(self, new_kwargs: dict) -> dict: - for field_name, field in self.model_meta.model_fields.items(): - if ( - field_name in new_kwargs - and field.name is not None - and field.name != field_name - ): - new_kwargs[field.name] = new_kwargs.pop(field_name) - return new_kwargs - - def _translate_aliases_to_columns(self, new_kwargs: dict) -> dict: - for field_name, field in self.model_meta.model_fields.items(): - if field.name in new_kwargs and field.name != field_name: - new_kwargs[field_name] = new_kwargs.pop(field.name) - return new_kwargs - def _remove_pk_from_kwargs(self, new_kwargs: dict) -> dict: pkname = self.model_meta.pkname pk = self.model_meta.model_fields[pkname] @@ -207,7 +191,7 @@ class QuerySet: async def update(self, each: bool = False, **kwargs: Any) -> int: self_fields = self.model.extract_db_own_fields() updates = {k: v for k, v in kwargs.items() if k in self_fields} - updates = self._translate_columns_to_aliases(updates) + updates = self.model.translate_columns_to_aliases(updates) if not each and not self.filter_clauses: raise QueryDefinitionError( "You cannot update without filtering the queryset first. " @@ -353,7 +337,7 @@ class QuerySet: f"{self.model.__name__} has to have {pk_name} filled." ) new_kwargs = self.model.substitute_models_with_pks(new_kwargs) - new_kwargs = self._translate_columns_to_aliases(new_kwargs) + new_kwargs = self.model.translate_columns_to_aliases(new_kwargs) new_kwargs = {"new_" + k: v for k, v in new_kwargs.items() if k in columns} ready_objects.append(new_kwargs) diff --git a/tests/test_models.py b/tests/test_models.py index f33d855..26de3f1 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,4 +1,5 @@ import asyncio +import uuid from datetime import datetime from typing import List @@ -6,7 +7,6 @@ import databases import pydantic import pytest import sqlalchemy -import uuid import ormar from ormar.exceptions import QueryDefinitionError, NoMatch @@ -437,3 +437,4 @@ async def test_start_and_end_filters(): users = await User.objects.filter(name__endswith="igo").all() assert len(users) == 2 +