diff --git a/django_mongodb_backend/fields/embedded_model.py b/django_mongodb_backend/fields/embedded_model.py index 590fd5f8..87b195b1 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,8 +134,11 @@ def get_transform(self, name): def validate(self, value, model_instance): super().validate(value, model_instance) - if self.embedded_model is None: - return + 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 ec9f9dfc..250a4885 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):