diff options
author | Tai Lee <tai.lee@3030.com.au> | 2012-08-01 11:49:01 +1000 |
---|---|---|
committer | Tim Graham <timograham@gmail.com> | 2013-10-11 12:52:57 -0400 |
commit | e527c0b6d808cb8e4bedf79ded3dc4ad1a7e17a8 (patch) | |
tree | 473c6c9585d87654c0ff868ec900438ec07af363 /django/core/serializers/python.py | |
parent | 945e033a6964c8c83c1c5ce5f188baf41a7a7701 (diff) | |
download | django-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.py | 20 |
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): """ |