fix excluding default values in nested model fields in prefetch_related
This commit is contained in:
@ -200,7 +200,7 @@ class Model(NewBaseModel):
|
|||||||
if not self.pk and self.Meta.model_fields[self.Meta.pkname].autoincrement:
|
if not self.pk and self.Meta.model_fields[self.Meta.pkname].autoincrement:
|
||||||
self_fields.pop(self.Meta.pkname, None)
|
self_fields.pop(self.Meta.pkname, None)
|
||||||
self_fields = self.populate_default_values(self_fields)
|
self_fields = self.populate_default_values(self_fields)
|
||||||
self.from_dict(
|
self.update_from_dict(
|
||||||
{
|
{
|
||||||
k: v
|
k: v
|
||||||
for k, v in self_fields.items()
|
for k, v in self_fields.items()
|
||||||
@ -274,7 +274,7 @@ class Model(NewBaseModel):
|
|||||||
|
|
||||||
async def update(self: T, **kwargs: Any) -> T:
|
async def update(self: T, **kwargs: Any) -> T:
|
||||||
if kwargs:
|
if kwargs:
|
||||||
self.from_dict(kwargs)
|
self.update_from_dict(kwargs)
|
||||||
|
|
||||||
if not self.pk:
|
if not self.pk:
|
||||||
raise ModelPersistenceError(
|
raise ModelPersistenceError(
|
||||||
@ -309,6 +309,6 @@ class Model(NewBaseModel):
|
|||||||
raise NoMatch("Instance was deleted from database and cannot be refreshed")
|
raise NoMatch("Instance was deleted from database and cannot be refreshed")
|
||||||
kwargs = dict(row)
|
kwargs = dict(row)
|
||||||
kwargs = self.translate_aliases_to_columns(kwargs)
|
kwargs = self.translate_aliases_to_columns(kwargs)
|
||||||
self.from_dict(kwargs)
|
self.update_from_dict(kwargs)
|
||||||
self.set_save_status(True)
|
self.set_save_status(True)
|
||||||
return self
|
return self
|
||||||
|
|||||||
@ -351,7 +351,7 @@ class NewBaseModel(
|
|||||||
|
|
||||||
return dict_instance
|
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():
|
for key, value in value_dict.items():
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
return self
|
return self
|
||||||
|
|||||||
@ -33,7 +33,7 @@ quick_access_set = {
|
|||||||
"delete",
|
"delete",
|
||||||
"dict",
|
"dict",
|
||||||
"extract_related_names",
|
"extract_related_names",
|
||||||
"from_dict",
|
"update_from_dict",
|
||||||
"get_column_alias",
|
"get_column_alias",
|
||||||
"get_column_name_from_alias",
|
"get_column_name_from_alias",
|
||||||
"get_filtered_names_to_extract",
|
"get_filtered_names_to_extract",
|
||||||
|
|||||||
@ -388,6 +388,9 @@ class PrefetchQuery:
|
|||||||
fields=fields,
|
fields=fields,
|
||||||
exclude_fields=exclude_fields,
|
exclude_fields=exclude_fields,
|
||||||
)
|
)
|
||||||
|
item["__excluded__"] = target_model.get_names_to_exclude(
|
||||||
|
fields=fields, exclude_fields=exclude_fields
|
||||||
|
)
|
||||||
instance = target_model(**item)
|
instance = target_model(**item)
|
||||||
instance = self._populate_nested_related(
|
instance = self._populate_nested_related(
|
||||||
model=instance, prefetch_dict=prefetch_dict, orders_by=orders_by
|
model=instance, prefetch_dict=prefetch_dict, orders_by=orders_by
|
||||||
|
|||||||
@ -45,10 +45,14 @@ class DateFieldsModel(ormar.Model):
|
|||||||
abstract = True
|
abstract = True
|
||||||
metadata = metadata
|
metadata = metadata
|
||||||
database = db
|
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)
|
created_date: datetime.datetime = ormar.DateTime(
|
||||||
updated_date: datetime.datetime = ormar.DateTime(default=datetime.datetime.now)
|
default=datetime.datetime.now, name="creation_date"
|
||||||
|
)
|
||||||
|
updated_date: datetime.datetime = ormar.DateTime(
|
||||||
|
default=datetime.datetime.now, name="modification_date"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Category(DateFieldsModel, AuditModel):
|
class Category(DateFieldsModel, AuditModel):
|
||||||
@ -139,6 +143,7 @@ async def test_fields_inherited_from_mixin():
|
|||||||
).save()
|
).save()
|
||||||
sub = await Subject(name="Bar", category=cat).save()
|
sub = await Subject(name="Bar", category=cat).save()
|
||||||
mixin_columns = ["created_date", "updated_date"]
|
mixin_columns = ["created_date", "updated_date"]
|
||||||
|
mixin_db_columns = ["creation_date", "modification_date"]
|
||||||
mixin2_columns = ["created_by", "updated_by"]
|
mixin2_columns = ["created_by", "updated_by"]
|
||||||
assert all(field in Category.Meta.model_fields for field in mixin_columns)
|
assert all(field in Category.Meta.model_fields for field in mixin_columns)
|
||||||
assert cat.created_date is not None
|
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()
|
assert "categories" in inspector.get_table_names()
|
||||||
table_columns = [x.get("name") for x in inspector.get_columns("categories")]
|
table_columns = [x.get("name") for x in inspector.get_columns("categories")]
|
||||||
assert all(
|
assert all(
|
||||||
col in table_columns for col in mixin_columns
|
col in table_columns for col in mixin_db_columns
|
||||||
) # + mixin2_columns)
|
) # + mixin2_columns)
|
||||||
|
|
||||||
assert "subjects" in inspector.get_table_names()
|
assert "subjects" in inspector.get_table_names()
|
||||||
table_columns = [x.get("name") for x in inspector.get_columns("subjects")]
|
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 = (
|
sub2 = (
|
||||||
await Subject.objects.select_related("category")
|
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.updated_date is None
|
||||||
assert sub2.category.created_by == "Sam"
|
assert sub2.category.created_by == "Sam"
|
||||||
assert sub2.category.updated_by == cat.updated_by
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user