Преглед на файлове

Merge pull request #717 from slurms/ticket_19746

Fixed #19746 -- Allow deserialization of pk-less data
Florian Apolloner преди 12 години
родител
ревизия
4506ae0497
променени са 3 файла, в които са добавени 27 реда и са изтрити 3 реда
  1. 1 1
      django/core/serializers/python.py
  2. 10 0
      docs/topics/serialization.txt
  3. 16 2
      tests/modeltests/serializers/tests.py

+ 1 - 1
django/core/serializers/python.py

@@ -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()
 

+ 10 - 0
docs/topics/serialization.txt

@@ -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

+ 16 - 2
tests/modeltests/serializers/tests.py

@@ -255,7 +255,7 @@ class SerializersTestBase(object):
         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):
@@ -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
@@ -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):
@@ -433,6 +444,9 @@ else:
         pkless_str = """- fields:
     name: Reference
   pk: null
+  model: serializers.category
+- fields:
+    name: Non-fiction
   model: serializers.category"""
 
         @staticmethod