summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrégoire ROCHER <gr@enix.org>2015-07-02 19:17:48 +0200
committerTim Graham <timograham@gmail.com>2015-07-02 14:46:16 -0400
commitc6cce4de38662d49d5eaaf197b62937f6ce25be7 (patch)
tree180904a8414e41fe9e323e4053d304fe33d2726e
parent7edd912cfbf91e8c7cc8bb742645973b82a9ab5a (diff)
Fixed #25050 -- Allowed serialization of models with deferred fields.
-rw-r--r--django/core/serializers/python.py3
-rw-r--r--django/core/serializers/xml_serializer.py3
-rw-r--r--tests/serializers/tests.py7
3 files changed, 11 insertions, 2 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index c97ab627a3..55c6292343 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -37,7 +37,8 @@ class Serializer(base.Serializer):
self._current = None
def get_dump_object(self, obj):
- data = OrderedDict([('model', force_text(obj._meta))])
+ model = obj._meta.proxy_for_model if obj._deferred else obj.__class__
+ data = OrderedDict([('model', force_text(model._meta))])
if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
data["pk"] = force_text(obj._get_pk_val(), strings_only=True)
data['fields'] = self._current
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 9a4bd77d44..9dfd8e70b5 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -52,7 +52,8 @@ class Serializer(base.Serializer):
raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
self.indent(1)
- attrs = OrderedDict([("model", smart_text(obj._meta))])
+ model = obj._meta.proxy_for_model if obj._deferred else obj.__class__
+ attrs = OrderedDict([("model", smart_text(model._meta))])
if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
obj_pk = obj._get_pk_val()
if obj_pk is not None:
diff --git a/tests/serializers/tests.py b/tests/serializers/tests.py
index 505e599f5e..b086df5084 100644
--- a/tests/serializers/tests.py
+++ b/tests/serializers/tests.py
@@ -224,6 +224,13 @@ class SerializersTestBase(object):
serial_str))
self.assertEqual(deserial_objs[0].object.score, Approximate(3.4, places=1))
+ def test_deferred_field_serialization(self):
+ author = Author.objects.create(name='Victor Hugo')
+ author = Author.objects.defer('name').get(pk=author.pk)
+ serial_str = serializers.serialize(self.serializer_name, [author])
+ deserial_objs = list(serializers.deserialize(self.serializer_name, serial_str))
+ self.assertIsInstance(deserial_objs[0].object, Author)
+
def test_custom_field_serialization(self):
"""Tests that custom fields serialize and deserialize intact"""
team_str = "Spartak Moskva"