ugly but working - to refactor
This commit is contained in:
@ -51,6 +51,8 @@ def populate_default_options_values(
|
||||
new_model.Meta.model_fields = model_fields
|
||||
if not hasattr(new_model.Meta, "abstract"):
|
||||
new_model.Meta.abstract = False
|
||||
if not hasattr(new_model.Meta, "order_by"):
|
||||
new_model.Meta.order_by = []
|
||||
|
||||
if any(
|
||||
is_field_an_forward_ref(field) for field in new_model.Meta.model_fields.values()
|
||||
|
||||
@ -110,6 +110,7 @@ def register_reverse_model_fields(model_field: Type["ForeignKeyField"]) -> None:
|
||||
owner=model_field.to,
|
||||
self_reference=model_field.self_reference,
|
||||
self_reference_primary=model_field.self_reference_primary,
|
||||
orders_by=model_field.related_orders_by,
|
||||
)
|
||||
# register foreign keys on through model
|
||||
model_field = cast(Type["ManyToManyField"], model_field)
|
||||
@ -123,6 +124,7 @@ def register_reverse_model_fields(model_field: Type["ForeignKeyField"]) -> None:
|
||||
related_name=model_field.name,
|
||||
owner=model_field.to,
|
||||
self_reference=model_field.self_reference,
|
||||
orders_by=model_field.related_orders_by,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@ -252,6 +252,9 @@ def populate_meta_tablename_columns_and_pk(
|
||||
|
||||
new_model.Meta.columns = columns
|
||||
new_model.Meta.pkname = pkname
|
||||
if not new_model.Meta.order_by:
|
||||
# by default we sort by pk name if other option not provided
|
||||
new_model.Meta.order_by.append(pkname)
|
||||
return new_model
|
||||
|
||||
|
||||
|
||||
@ -71,6 +71,7 @@ class ModelMeta:
|
||||
signals: SignalEmitter
|
||||
abstract: bool
|
||||
requires_ref_update: bool
|
||||
order_by: List[str]
|
||||
|
||||
|
||||
def add_cached_properties(new_model: Type["Model"]) -> None:
|
||||
|
||||
@ -273,7 +273,10 @@ class Model(ModelRow):
|
||||
return self
|
||||
|
||||
async def load_all(
|
||||
self: T, follow: bool = False, exclude: Union[List, str, Set, Dict] = None
|
||||
self: T,
|
||||
follow: bool = False,
|
||||
exclude: Union[List, str, Set, Dict] = None,
|
||||
order_by: Union[List, str] = None,
|
||||
) -> T:
|
||||
"""
|
||||
Allow to refresh existing Models fields from database.
|
||||
@ -291,6 +294,8 @@ class Model(ModelRow):
|
||||
will load second Model A but will never follow into Model X.
|
||||
Nested relations of those kind need to be loaded manually.
|
||||
|
||||
:param order_by: columns by which models should be sorted
|
||||
:type order_by: Union[List, str]
|
||||
:raises NoMatch: If given pk is not found in database.
|
||||
|
||||
:param exclude: related models to exclude
|
||||
@ -308,6 +313,8 @@ class Model(ModelRow):
|
||||
queryset = self.__class__.objects
|
||||
if exclude:
|
||||
queryset = queryset.exclude_fields(exclude)
|
||||
if order_by:
|
||||
queryset = queryset.order_by(order_by)
|
||||
instance = await queryset.select_related(relations).get(pk=self.pk)
|
||||
self._orm.clear()
|
||||
self.update_from_dict(instance.dict())
|
||||
|
||||
Reference in New Issue
Block a user