summaryrefslogtreecommitdiff
path: root/django/core/serializers/python.py
diff options
context:
space:
mode:
authorTai Lee <tai.lee@3030.com.au>2012-08-01 11:49:01 +1000
committerTim Graham <timograham@gmail.com>2013-10-11 12:52:57 -0400
commite527c0b6d808cb8e4bedf79ded3dc4ad1a7e17a8 (patch)
tree473c6c9585d87654c0ff868ec900438ec07af363 /django/core/serializers/python.py
parent945e033a6964c8c83c1c5ce5f188baf41a7a7701 (diff)
downloaddjango-e527c0b6d808cb8e4bedf79ded3dc4ad1a7e17a8.tar.gz
Fixed #13252 -- Added ability to serialize with natural primary keys.
Added ``--natural-foreign`` and ``--natural-primary`` options and deprecated the ``--natural`` option to the ``dumpdata`` management command. Added ``use_natural_foreign_keys`` and ``use_natural_primary_keys`` arguments and deprecated the ``use_natural_keys`` argument to ``django.core.serializers.Serializer.serialize()``. Thanks SmileyChris for the suggestion.
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):
"""