Skip to content

Commit fe862bf

Browse files
committed
Make EmbeddedModelField.validate() check value type
1 parent 1c4d2bd commit fe862bf

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

django_mongodb_backend/fields/embedded_model.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import difflib
22

33
from django.core import checks
4-
from django.core.exceptions import FieldDoesNotExist
4+
from django.core.exceptions import FieldDoesNotExist, ValidationError
55
from django.db import models
66
from django.db.models.fields.related import lazy_related_operation
77
from django.db.models.lookups import Transform
@@ -134,6 +134,11 @@ def get_transform(self, name):
134134

135135
def validate(self, value, model_instance):
136136
super().validate(value, model_instance)
137+
if not isinstance(value, self.embedded_model):
138+
raise ValidationError(
139+
f"Expected instance of type {self.embedded_model!r}, not {type(value)!r}."
140+
)
141+
137142
for field in self.embedded_model._meta.fields:
138143
attname = field.attname
139144
field.validate(getattr(value, attname), model_instance)

tests/model_fields_/test_embedded_model.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ def test_validate(self):
5050
with self.assertRaisesMessage(ValidationError, msg):
5151
obj.full_clean()
5252

53+
def test_validate_wrong_model_type(self):
54+
obj = Holder(data=Library())
55+
msg = (
56+
"{'data': [\"Expected instance of type "
57+
"<class 'model_fields_.models.Data'>, not "
58+
"<class 'model_fields_.models.Library'>.\"]}"
59+
)
60+
with self.assertRaisesMessage(ValidationError, msg):
61+
obj.full_clean()
62+
5363

5464
class ModelTests(TestCase):
5565
def test_save_load(self):

0 commit comments

Comments
 (0)