diff --git a/ormar/models/model.py b/ormar/models/model.py index 12b5d80..03a00bd 100644 --- a/ormar/models/model.py +++ b/ormar/models/model.py @@ -200,7 +200,7 @@ class Model(NewBaseModel): if not self.pk and self.Meta.model_fields[self.Meta.pkname].autoincrement: self_fields.pop(self.Meta.pkname, None) self_fields = self.populate_default_values(self_fields) - self.from_dict( + self.update_from_dict( { k: v for k, v in self_fields.items() @@ -274,7 +274,7 @@ class Model(NewBaseModel): async def update(self: T, **kwargs: Any) -> T: if kwargs: - self.from_dict(kwargs) + self.update_from_dict(kwargs) if not self.pk: raise ModelPersistenceError( @@ -309,6 +309,6 @@ class Model(NewBaseModel): raise NoMatch("Instance was deleted from database and cannot be refreshed") kwargs = dict(row) kwargs = self.translate_aliases_to_columns(kwargs) - self.from_dict(kwargs) + self.update_from_dict(kwargs) self.set_save_status(True) return self diff --git a/ormar/models/newbasemodel.py b/ormar/models/newbasemodel.py index b8955a3..569ce98 100644 --- a/ormar/models/newbasemodel.py +++ b/ormar/models/newbasemodel.py @@ -351,7 +351,7 @@ class NewBaseModel( return dict_instance - def from_dict(self, value_dict: Dict) -> "NewBaseModel": + def update_from_dict(self, value_dict: Dict) -> "NewBaseModel": for key, value in value_dict.items(): setattr(self, key, value) return self diff --git a/ormar/models/quick_access_views.py b/ormar/models/quick_access_views.py index 471c809..19fc764 100644 --- a/ormar/models/quick_access_views.py +++ b/ormar/models/quick_access_views.py @@ -33,7 +33,7 @@ quick_access_set = { "delete", "dict", "extract_related_names", - "from_dict", + "update_from_dict", "get_column_alias", "get_column_name_from_alias", "get_filtered_names_to_extract", diff --git a/ormar/queryset/prefetch_query.py b/ormar/queryset/prefetch_query.py index a2d631d..1f38c38 100644 --- a/ormar/queryset/prefetch_query.py +++ b/ormar/queryset/prefetch_query.py @@ -388,6 +388,9 @@ class PrefetchQuery: fields=fields, exclude_fields=exclude_fields, ) + item["__excluded__"] = target_model.get_names_to_exclude( + fields=fields, exclude_fields=exclude_fields + ) instance = target_model(**item) instance = self._populate_nested_related( model=instance, prefetch_dict=prefetch_dict, orders_by=orders_by diff --git a/tests/test_inheritance_concrete.py b/tests/test_inheritance_concrete.py index 93b500e..8cef051 100644 --- a/tests/test_inheritance_concrete.py +++ b/tests/test_inheritance_concrete.py @@ -45,10 +45,14 @@ class DateFieldsModel(ormar.Model): abstract = True metadata = metadata database = db - constraints = [ormar.UniqueColumns("created_date", "updated_date")] + constraints = [ormar.UniqueColumns("creation_date", "modification_date")] - created_date: datetime.datetime = ormar.DateTime(default=datetime.datetime.now) - updated_date: datetime.datetime = ormar.DateTime(default=datetime.datetime.now) + created_date: datetime.datetime = ormar.DateTime( + default=datetime.datetime.now, name="creation_date" + ) + updated_date: datetime.datetime = ormar.DateTime( + default=datetime.datetime.now, name="modification_date" + ) class Category(DateFieldsModel, AuditModel): @@ -139,6 +143,7 @@ async def test_fields_inherited_from_mixin(): ).save() sub = await Subject(name="Bar", category=cat).save() mixin_columns = ["created_date", "updated_date"] + mixin_db_columns = ["creation_date", "modification_date"] mixin2_columns = ["created_by", "updated_by"] assert all(field in Category.Meta.model_fields for field in mixin_columns) assert cat.created_date is not None @@ -156,12 +161,12 @@ async def test_fields_inherited_from_mixin(): assert "categories" in inspector.get_table_names() table_columns = [x.get("name") for x in inspector.get_columns("categories")] assert all( - col in table_columns for col in mixin_columns + col in table_columns for col in mixin_db_columns ) # + mixin2_columns) assert "subjects" in inspector.get_table_names() table_columns = [x.get("name") for x in inspector.get_columns("subjects")] - assert all(col in table_columns for col in mixin_columns) + assert all(col in table_columns for col in mixin_db_columns) sub2 = ( await Subject.objects.select_related("category") @@ -179,3 +184,20 @@ async def test_fields_inherited_from_mixin(): assert sub2.updated_date is None assert sub2.category.created_by == "Sam" assert sub2.category.updated_by == cat.updated_by + + sub3 = ( + await Subject.objects.prefetch_related("category") + .order_by("-created_date") + .exclude_fields({"updated_date": ..., "category": {"updated_date"}}) + .get() + ) + assert round_date_to_seconds(sub3.created_date) == round_date_to_seconds( + sub.created_date + ) + assert sub3.category.updated_date is None + assert round_date_to_seconds( + sub3.category.created_date + ) == round_date_to_seconds(cat.created_date) + assert sub3.updated_date is None + assert sub3.category.created_by == "Sam" + assert sub3.category.updated_by == cat.updated_by