summaryrefslogtreecommitdiff
path: root/django/core/serializers/python.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/core/serializers/python.py')
-rw-r--r--django/core/serializers/python.py20
1 files changed, 13 insertions, 7 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index cdfac5044b..89c0bdfa28 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -34,11 +34,14 @@ class Serializer(base.Serializer):
self._current = None
def get_dump_object(self, obj):
- return {
- "pk": smart_text(obj._get_pk_val(), strings_only=True),
+ data = {
"model": smart_text(obj._meta),
- "fields": self._current
+ "fields": self._current,
}
+ if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
+ data["pk"] = smart_text(obj._get_pk_val(), strings_only=True)
+
+ return data
def handle_field(self, obj, field):
value = field._get_val_from_obj(obj)
@@ -51,7 +54,7 @@ class Serializer(base.Serializer):
self._current[field.name] = field.value_to_string(obj)
def handle_fk_field(self, obj, field):
- if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
+ if self.use_natural_foreign_keys and hasattr(field.rel.to, 'natural_key'):
related = getattr(obj, field.name)
if related:
value = related.natural_key()
@@ -63,7 +66,7 @@ class Serializer(base.Serializer):
def handle_m2m_field(self, obj, field):
if field.rel.through._meta.auto_created:
- if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
+ if self.use_natural_foreign_keys and hasattr(field.rel.to, 'natural_key'):
m2m_value = lambda value: value.natural_key()
else:
m2m_value = lambda value: smart_text(value._get_pk_val(), strings_only=True)
@@ -88,7 +91,9 @@ 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.get("pk", None))}
+ data = {}
+ if 'pk' in d:
+ data[Model._meta.pk.attname] = Model._meta.pk.to_python(d.get("pk", None))
m2m_data = {}
model_fields = Model._meta.get_all_field_names()
@@ -139,7 +144,8 @@ def Deserializer(object_list, **options):
else:
data[field.name] = field.to_python(field_value)
- yield base.DeserializedObject(Model(**data), m2m_data)
+ obj = base.build_instance(Model, data, db)
+ yield base.DeserializedObject(obj, m2m_data)
def _get_model(model_identifier):
"""