From 738e9e615dc81b561c9fb01439119f4475c2e25b Mon Sep 17 00:00:00 2001
From: Baptiste Mispelon <bmispelon@gmail.com>
Date: Wed, 11 Dec 2019 19:36:57 +0100
Subject: [PATCH] Fixed #26743 -- Fixed UnboundLocalError crash when
 deserializing m2m fields and value isn't iterable.

---
 django/core/serializers/base.py |  6 +++++-
 tests/serializers/test_json.py  | 14 ++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

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
@@ -282,9 +282,13 @@ def deserialize_m2m_values(field, field_value, using, handle_forward_references)
         def m2m_convert(v):
             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"