1
0
mirror of https://github.com/django/django.git synced 2025-04-01 20:16:43 +00:00

Merge pull request from slurms/ticket_19746

Fixed  -- Allow deserialization of pk-less data
This commit is contained in:
Florian Apolloner 2013-02-24 06:31:14 -08:00
commit 4506ae0497
3 changed files with 27 additions and 3 deletions
django/core/serializers
docs/topics
tests/modeltests/serializers

@ -88,7 +88,7 @@ def Deserializer(object_list, **options):
for d in object_list: for d in object_list:
# Look up the model and starting build a dict of data for it. # Look up the model and starting build a dict of data for it.
Model = _get_model(d["model"]) 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 = {} m2m_data = {}
model_fields = Model._meta.get_all_field_names() model_fields = Model._meta.get_all_field_names()

@ -117,6 +117,16 @@ object and any associated relationship data.
Calling ``DeserializedObject.save()`` saves the object to the database. 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 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 data in your serialized representation doesn't match what's currently in the
database. Usually, working with these ``DeserializedObject`` instances looks database. Usually, working with these ``DeserializedObject`` instances looks

@ -255,7 +255,7 @@ class SerializersTestBase(object):
for obj in deserial_objs: for obj in deserial_objs:
self.assertFalse(obj.object.id) self.assertFalse(obj.object.id)
obj.save() obj.save()
self.assertEqual(Category.objects.all().count(), 4) self.assertEqual(Category.objects.all().count(), 5)
class SerializersTransactionTestBase(object): class SerializersTransactionTestBase(object):
@ -290,6 +290,9 @@ class XmlSerializerTestCase(SerializersTestBase, TestCase):
<object model="serializers.category"> <object model="serializers.category">
<field type="CharField" name="name">Reference</field> <field type="CharField" name="name">Reference</field>
</object> </object>
<object model="serializers.category">
<field type="CharField" name="name">Non-fiction</field>
</object>
</django-objects>""" </django-objects>"""
@staticmethod @staticmethod
@ -351,7 +354,15 @@ class XmlSerializerTransactionTestCase(SerializersTransactionTestBase, Transacti
class JsonSerializerTestCase(SerializersTestBase, TestCase): class JsonSerializerTestCase(SerializersTestBase, TestCase):
serializer_name = "json" 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 @staticmethod
def _validate_output(serial_str): def _validate_output(serial_str):
@ -433,6 +444,9 @@ else:
pkless_str = """- fields: pkless_str = """- fields:
name: Reference name: Reference
pk: null pk: null
model: serializers.category
- fields:
name: Non-fiction
model: serializers.category""" model: serializers.category"""
@staticmethod @staticmethod