From 1c4d2bd25078eb05a8452b2ef22ada8b5d930f77 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Mon, 23 Jun 2025 17:15:39 -0400 Subject: [PATCH 1/2] Remove useless code in EmbeddedModelField.validate() --- django_mongodb_backend/fields/embedded_model.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/django_mongodb_backend/fields/embedded_model.py b/django_mongodb_backend/fields/embedded_model.py index 590fd5f8d..cf3b1b106 100644 --- a/django_mongodb_backend/fields/embedded_model.py +++ b/django_mongodb_backend/fields/embedded_model.py @@ -134,8 +134,6 @@ def get_transform(self, name): def validate(self, value, model_instance): super().validate(value, model_instance) - if self.embedded_model is None: - return for field in self.embedded_model._meta.fields: attname = field.attname field.validate(getattr(value, attname), model_instance) From fe862bfbfe4adf2b8b40b55bccd96ee8e9f95ecc Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Mon, 23 Jun 2025 17:29:52 -0400 Subject: [PATCH 2/2] Make EmbeddedModelField.validate() check value type --- django_mongodb_backend/fields/embedded_model.py | 7 ++++++- tests/model_fields_/test_embedded_model.py | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/django_mongodb_backend/fields/embedded_model.py b/django_mongodb_backend/fields/embedded_model.py index cf3b1b106..87b195b18 100644 --- a/django_mongodb_backend/fields/embedded_model.py +++ b/django_mongodb_backend/fields/embedded_model.py @@ -1,7 +1,7 @@ import difflib from django.core import checks -from django.core.exceptions import FieldDoesNotExist +from django.core.exceptions import FieldDoesNotExist, ValidationError from django.db import models from django.db.models.fields.related import lazy_related_operation from django.db.models.lookups import Transform @@ -134,6 +134,11 @@ def get_transform(self, name): def validate(self, value, model_instance): super().validate(value, model_instance) + if not isinstance(value, self.embedded_model): + raise ValidationError( + f"Expected instance of type {self.embedded_model!r}, not {type(value)!r}." + ) + for field in self.embedded_model._meta.fields: attname = field.attname field.validate(getattr(value, attname), model_instance) diff --git a/tests/model_fields_/test_embedded_model.py b/tests/model_fields_/test_embedded_model.py index ec9f9dfc4..250a48855 100644 --- a/tests/model_fields_/test_embedded_model.py +++ b/tests/model_fields_/test_embedded_model.py @@ -50,6 +50,16 @@ def test_validate(self): with self.assertRaisesMessage(ValidationError, msg): obj.full_clean() + def test_validate_wrong_model_type(self): + obj = Holder(data=Library()) + msg = ( + "{'data': [\"Expected instance of type " + ", not " + ".\"]}" + ) + with self.assertRaisesMessage(ValidationError, msg): + obj.full_clean() + class ModelTests(TestCase): def test_save_load(self):