summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/core/serializers/base.py6
-rw-r--r--tests/serializers/test_json.py14
2 files changed, 19 insertions, 1 deletions
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index cf8e7d3b86..72565236c4 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -283,8 +283,12 @@ def deserialize_m2m_values(field, field_value, using, handle_forward_references)
return model._meta.pk.to_python(v)
try:
+ pks_iter = iter(field_value)
+ except TypeError as e:
+ raise M2MDeserializationError(e, field_value)
+ try:
values = []
- for pk in field_value:
+ for pk in pks_iter:
values.append(m2m_convert(pk))
return values
except Exception as e:
diff --git a/tests/serializers/test_json.py b/tests/serializers/test_json.py
index a804aa1f3a..93e51e124c 100644
--- a/tests/serializers/test_json.py
+++ b/tests/serializers/test_json.py
@@ -252,6 +252,20 @@ class JsonSerializerTestCase(SerializersTestBase, TestCase):
for obj in serializers.deserialize('json', test_string, ignore=False):
obj.save()
+ def test_helpful_error_message_for_many2many_not_iterable(self):
+ """
+ Not iterable many-to-many field value throws a helpful error message.
+ """
+ test_string = """[{
+ "pk": 1,
+ "model": "serializers.m2mdata",
+ "fields": {"data": null}
+ }]"""
+
+ expected = "(serializers.m2mdata:pk=1) field_value was 'None'"
+ with self.assertRaisesMessage(DeserializationError, expected):
+ next(serializers.deserialize('json', test_string, ignore=False))
+
class JsonSerializerTransactionTestCase(SerializersTransactionTestBase, TransactionTestCase):
serializer_name = "json"