change limit/offset with select related to be applied on a subquery and limit only main model query

This commit is contained in:
collerek
2020-12-21 18:42:17 +01:00
parent 514e8c4ad5
commit c8aad2385c
18 changed files with 329 additions and 69 deletions

View File

@ -40,7 +40,7 @@ class AliasManager:
return text(f"{name} {alias}_{name}")
def add_relation_type(
self, source_model: Type["Model"], relation_name: str, is_multi: bool = False
self, source_model: Type["Model"], relation_name: str
) -> None:
parent_key = f"{source_model.get_name()}_{relation_name}"
if parent_key not in self._aliases_new:
@ -50,7 +50,7 @@ class AliasManager:
related_name = to_field.related_name
if not related_name:
related_name = child_model.resolve_relation_name(
child_model, source_model, explicit_multi=is_multi
child_model, source_model, explicit_multi=True
)
child_key = f"{child_model.get_name()}_{related_name}"
if child_key not in self._aliases_new:

View File

@ -53,7 +53,7 @@ class QuerysetProxy(ormar.QuerySetProtocol):
def _assign_child_to_parent(self, child: Optional["T"]) -> None:
if child:
owner = self._owner
rel_name = owner.resolve_relation_name(owner, child)
rel_name = self.relation.field_name
setattr(owner, rel_name, child)
def _register_related(self, child: Union["T", Sequence[Optional["T"]]]) -> None:

View File

@ -89,11 +89,10 @@ class RelationsManager:
@staticmethod
def remove_parent(
item: Union["NewBaseModel", Type["NewBaseModel"]], name: "Model"
item: Union["NewBaseModel", Type["NewBaseModel"]], parent: "Model", name: str
) -> None:
related_model = name
rel_name = item.resolve_relation_name(item, related_model)
if rel_name in item._orm:
relation_name = item.resolve_relation_name(related_model, item)
item._orm.remove(rel_name, related_model)
related_model._orm.remove(relation_name, item)
relation_name = (
item.Meta.model_fields[name].related_name or item.get_name() + "s"
)
item._orm.remove(name, parent)
parent._orm.remove(relation_name, item)