summaryrefslogtreecommitdiff
path: root/django/core/serializers/python.py
diff options
context:
space:
mode:
authorRichard Eames <github@naddiseo.ca>2015-03-26 12:31:09 -0600
committerTim Graham <timograham@gmail.com>2015-04-09 10:56:33 -0400
commit727e40c879f893a2c336e396aafdcad60b5d224c (patch)
tree2a4ea6530e470cdde9a0827782eff08f5a1cb9a5 /django/core/serializers/python.py
parent9d0c600d8d6359107cdbef5f0c30757321da09f6 (diff)
downloaddjango-727e40c879f893a2c336e396aafdcad60b5d224c.tar.gz
Fixed #19820 -- Added more helpful error messages to Python deserializer.
Diffstat (limited to 'django/core/serializers/python.py')
-rw-r--r--django/core/serializers/python.py45
1 files changed, 30 insertions, 15 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index d209f7ebd0..c97ab627a3 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -100,7 +100,10 @@ def Deserializer(object_list, **options):
raise
data = {}
if 'pk' in d:
- data[Model._meta.pk.attname] = Model._meta.pk.to_python(d.get("pk", None))
+ try:
+ data[Model._meta.pk.attname] = Model._meta.pk.to_python(d.get('pk'))
+ except Exception as e:
+ raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), None)
m2m_data = {}
field_names = {f.name for f in Model._meta.get_fields()}
@@ -128,30 +131,42 @@ def Deserializer(object_list, **options):
return force_text(field.remote_field.model._meta.pk.to_python(value), strings_only=True)
else:
m2m_convert = lambda v: force_text(field.remote_field.model._meta.pk.to_python(v), strings_only=True)
- m2m_data[field.name] = [m2m_convert(pk) for pk in field_value]
+
+ try:
+ m2m_data[field.name] = []
+ for pk in field_value:
+ m2m_data[field.name].append(m2m_convert(pk))
+ except Exception as e:
+ raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), pk)
# Handle FK fields
elif field.remote_field and isinstance(field.remote_field, models.ManyToOneRel):
if field_value is not None:
- if hasattr(field.remote_field.model._default_manager, 'get_by_natural_key'):
- if hasattr(field_value, '__iter__') and not isinstance(field_value, six.text_type):
- obj = field.remote_field.model._default_manager.db_manager(db).get_by_natural_key(*field_value)
- value = getattr(obj, field.remote_field.field_name)
- # If this is a natural foreign key to an object that
- # has a FK/O2O as the foreign key, use the FK value
- if field.remote_field.model._meta.pk.remote_field:
- value = value.pk
+ try:
+ if hasattr(field.remote_field.model._default_manager, 'get_by_natural_key'):
+ if hasattr(field_value, '__iter__') and not isinstance(field_value, six.text_type):
+ obj = field.remote_field.model._default_manager.db_manager(db).get_by_natural_key(*field_value)
+ value = getattr(obj, field.remote_field.field_name)
+ # If this is a natural foreign key to an object that
+ # has a FK/O2O as the foreign key, use the FK value
+ if field.remote_field.model._meta.pk.remote_field:
+ value = value.pk
+ else:
+ value = field.remote_field.model._meta.get_field(field.remote_field.field_name).to_python(field_value)
+ data[field.attname] = value
else:
- value = field.remote_field.model._meta.get_field(field.remote_field.field_name).to_python(field_value)
- data[field.attname] = value
- else:
- data[field.attname] = field.remote_field.model._meta.get_field(field.remote_field.field_name).to_python(field_value)
+ data[field.attname] = field.remote_field.model._meta.get_field(field.remote_field.field_name).to_python(field_value)
+ except Exception as e:
+ raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), field_value)
else:
data[field.attname] = None
# Handle all other fields
else:
- data[field.name] = field.to_python(field_value)
+ try:
+ data[field.name] = field.to_python(field_value)
+ except Exception as e:
+ raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), field_value)
obj = base.build_instance(Model, data, db)
yield base.DeserializedObject(obj, m2m_data)