initial working solution for aliases/different db column names in basic operations
This commit is contained in:
@ -44,7 +44,7 @@ class QueryClause:
|
||||
) -> Tuple[List[sqlalchemy.sql.expression.TextClause], List[str]]:
|
||||
|
||||
if kwargs.get("pk"):
|
||||
pk_name = self.model_cls.Meta.pkname
|
||||
pk_name = self.model_cls.get_column_alias(self.model_cls.Meta.pkname)
|
||||
kwargs[pk_name] = kwargs.pop("pk")
|
||||
|
||||
filter_clauses, select_related = self._populate_filter_clauses(**kwargs)
|
||||
|
||||
@ -106,7 +106,9 @@ class SqlJoin:
|
||||
self.select_from = sqlalchemy.sql.outerjoin(
|
||||
self.select_from, target_table, on_clause
|
||||
)
|
||||
self.order_bys.append(text(f"{alias}_{to_table}.{model_cls.Meta.pkname}"))
|
||||
|
||||
pkname_alias = model_cls.get_column_alias(model_cls.Meta.pkname)
|
||||
self.order_bys.append(text(f"{alias}_{to_table}.{pkname_alias}"))
|
||||
self_related_fields = model_cls.own_table_columns(
|
||||
model_cls, self.fields, nested=True
|
||||
)
|
||||
@ -125,12 +127,13 @@ class SqlJoin:
|
||||
part: str,
|
||||
) -> Tuple[str, str]:
|
||||
if join_params.prev_model.Meta.model_fields[part].virtual or is_multi:
|
||||
to_field = model_cls.resolve_relation_field(
|
||||
to_field = model_cls.resolve_relation_name(
|
||||
model_cls, join_params.prev_model
|
||||
)
|
||||
to_key = to_field.name
|
||||
from_key = model_cls.Meta.pkname
|
||||
to_key = model_cls.get_column_alias(to_field)
|
||||
from_key = join_params.prev_model.get_column_alias(model_cls.Meta.pkname)
|
||||
else:
|
||||
to_key = model_cls.Meta.pkname
|
||||
from_key = part
|
||||
to_key = model_cls.get_column_alias(model_cls.Meta.pkname)
|
||||
from_key = join_params.prev_model.get_column_alias(part)
|
||||
|
||||
return to_key, from_key
|
||||
|
||||
@ -40,7 +40,8 @@ class Query:
|
||||
|
||||
@property
|
||||
def prefixed_pk_name(self) -> str:
|
||||
return f"{self.table.name}.{self.model_cls.Meta.pkname}"
|
||||
pkname_alias = self.model_cls.get_column_alias(self.model_cls.Meta.pkname)
|
||||
return f"{self.table.name}.{pkname_alias}"
|
||||
|
||||
def build_select_expression(self) -> Tuple[sqlalchemy.sql.select, List[str]]:
|
||||
self_related_fields = self.model_cls.own_table_columns(
|
||||
|
||||
@ -70,12 +70,29 @@ class QuerySet:
|
||||
return self.model.merge_instances_list(result_rows) # type: ignore
|
||||
return result_rows
|
||||
|
||||
def _prepare_model_to_save(self, new_kwargs: dict) -> dict:
|
||||
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)
|
||||
return new_kwargs
|
||||
|
||||
def _populate_default_values(self, new_kwargs: dict) -> dict:
|
||||
for field_name, field in self.model_meta.model_fields.items():
|
||||
if field_name not in new_kwargs and field.has_default():
|
||||
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 _remove_pk_from_kwargs(self, new_kwargs: dict) -> dict:
|
||||
pkname = self.model_meta.pkname
|
||||
pk = self.model_meta.model_fields[pkname]
|
||||
@ -278,9 +295,7 @@ class QuerySet:
|
||||
async def create(self, **kwargs: Any) -> "Model":
|
||||
|
||||
new_kwargs = dict(**kwargs)
|
||||
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._prepare_model_to_save(new_kwargs)
|
||||
|
||||
expr = self.table.insert()
|
||||
expr = expr.values(**new_kwargs)
|
||||
@ -288,7 +303,7 @@ class QuerySet:
|
||||
instance = self.model(**kwargs)
|
||||
pk = await self.database.execute(expr)
|
||||
|
||||
pk_name = self.model_meta.pkname
|
||||
pk_name = self.model.get_column_alias(self.model_meta.pkname)
|
||||
if pk_name not in kwargs and pk_name in new_kwargs:
|
||||
instance.pk = new_kwargs[self.model_meta.pkname]
|
||||
if pk and isinstance(pk, self.model.pk_type()):
|
||||
@ -300,9 +315,7 @@ class QuerySet:
|
||||
ready_objects = []
|
||||
for objt in objects:
|
||||
new_kwargs = objt.dict()
|
||||
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._prepare_model_to_save(new_kwargs)
|
||||
ready_objects.append(new_kwargs)
|
||||
|
||||
expr = self.table.insert()
|
||||
|
||||
Reference in New Issue
Block a user