Skip to content

Commit

Permalink
Fixed #19746 -- Allow deserialization of pk-less data
Browse files Browse the repository at this point in the history
  • Loading branch information
slurms committed Feb 12, 2013
1 parent 5a3d949 commit 278dad5
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
2 changes: 1 addition & 1 deletion django/core/serializers/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def Deserializer(object_list, **options):
for d in object_list:
# Look up the model and starting build a dict of data for it.
Model = _get_model(d["model"])
data = {Model._meta.pk.attname: Model._meta.pk.to_python(d["pk"])}
data = {Model._meta.pk.attname: Model._meta.pk.to_python(d.get("pk", None))}
m2m_data = {}
model_fields = Model._meta.get_all_field_names()

Expand Down
10 changes: 10 additions & 0 deletions docs/topics/serialization.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ object and any associated relationship data.

Calling ``DeserializedObject.save()`` saves the object to the database.

.. note::

If the ``pk`` attribute in the serialized data doesn't exist or is
null, a new instance will be saved to the database.

.. versionchanged:: 1.6

In previous versions of Django, the ``pk`` attribute had to be present
on the serialized data or a ``DeserializationError`` would be raised.

This ensures that deserializing is a non-destructive operation even if the
data in your serialized representation doesn't match what's currently in the
database. Usually, working with these ``DeserializedObject`` instances looks
Expand Down
18 changes: 16 additions & 2 deletions tests/modeltests/serializers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ def test_pkless_serialized_strings(self):
for obj in deserial_objs:
self.assertFalse(obj.object.id)
obj.save()
self.assertEqual(Category.objects.all().count(), 4)
self.assertEqual(Category.objects.all().count(), 5)


class SerializersTransactionTestBase(object):
Expand Down Expand Up @@ -290,6 +290,9 @@ class XmlSerializerTestCase(SerializersTestBase, TestCase):
<object model="serializers.category">
<field type="CharField" name="name">Reference</field>
</object>
<object model="serializers.category">
<field type="CharField" name="name">Non-fiction</field>
</object>
</django-objects>"""

@staticmethod
Expand Down Expand Up @@ -351,7 +354,15 @@ class XmlSerializerTransactionTestCase(SerializersTransactionTestBase, Transacti

class JsonSerializerTestCase(SerializersTestBase, TestCase):
serializer_name = "json"
pkless_str = """[{"pk": null, "model": "serializers.category", "fields": {"name": "Reference"}}]"""
pkless_str = """[
{
"pk": null,
"model": "serializers.category",
"fields": {"name": "Reference"}
}, {
"model": "serializers.category",
"fields": {"name": "Non-fiction"}
}]"""

@staticmethod
def _validate_output(serial_str):
Expand Down Expand Up @@ -433,6 +444,9 @@ class YamlSerializerTestCase(SerializersTestBase, TestCase):
pkless_str = """- fields:
name: Reference
pk: null
model: serializers.category
- fields:
name: Non-fiction
model: serializers.category"""

@staticmethod
Expand Down

0 comments on commit 278dad5

Please sign in to comment.