summaryrefslogtreecommitdiff
path: root/django/core/serializers/python.py
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-07-04 12:11:04 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2007-07-04 12:11:04 +0000
commit953badbea5a04159adbfa970f5805c0232b6a401 (patch)
tree9569f74b5d382b222613a1085efd0de21937e95f /django/core/serializers/python.py
parent4c958b15b250866b70ded7d82aa532f1e57f96ae (diff)
Merged Unicode branch into trunk (r4952:5608). This should be fully
backwards compatible for all practical purposes. Fixed #2391, #2489, #2996, #3322, #3344, #3370, #3406, #3432, #3454, #3492, #3582, #3690, #3878, #3891, #3937, #4039, #4141, #4227, #4286, #4291, #4300, #4452, #4702 git-svn-id: http://code.djangoproject.com/svn/django/trunk@5609 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/core/serializers/python.py')
-rw-r--r--django/core/serializers/python.py49
1 files changed, 22 insertions, 27 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index 5fbb3163f7..f61a2fa4a2 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -7,33 +7,34 @@ other serializers.
from django.conf import settings
from django.core.serializers import base
from django.db import models
+from django.utils.encoding import smart_unicode
class Serializer(base.Serializer):
"""
Serializes a QuerySet to basic Python objects.
"""
-
+
def start_serialization(self):
self._current = None
self.objects = []
-
+
def end_serialization(self):
pass
-
+
def start_object(self, obj):
self._current = {}
-
+
def end_object(self, obj):
self.objects.append({
- "model" : str(obj._meta),
- "pk" : str(obj._get_pk_val()),
+ "model" : smart_unicode(obj._meta),
+ "pk" : smart_unicode(obj._get_pk_val()),
"fields" : self._current
})
self._current = None
-
+
def handle_field(self, obj, field):
self._current[field.name] = getattr(obj, field.name)
-
+
def handle_fk_field(self, obj, field):
related = getattr(obj, field.name)
if related is not None:
@@ -44,17 +45,17 @@ class Serializer(base.Serializer):
# Related to remote object via other field
related = getattr(related, field.rel.field_name)
self._current[field.name] = related
-
+
def handle_m2m_field(self, obj, field):
self._current[field.name] = [related._get_pk_val() for related in getattr(obj, field.name).iterator()]
-
+
def getvalue(self):
return self.objects
def Deserializer(object_list, **options):
"""
Deserialize simple Python objects back into Django ORM instances.
-
+
It's expected that you pass the Python objects themselves (instead of a
stream or a string) to the constructor
"""
@@ -64,36 +65,30 @@ def Deserializer(object_list, **options):
Model = _get_model(d["model"])
data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
m2m_data = {}
-
+
# Handle each field
for (field_name, field_value) in d["fields"].iteritems():
- if isinstance(field_value, unicode):
- field_value = field_value.encode(options.get("encoding", settings.DEFAULT_CHARSET))
-
+ if isinstance(field_value, str):
+ field_value = smart_unicode(field_value, options.get("encoding", settings.DEFAULT_CHARSET), strings_only=True)
+
field = Model._meta.get_field(field_name)
-
+
# Handle M2M relations
if field.rel and isinstance(field.rel, models.ManyToManyRel):
- pks = []
m2m_convert = field.rel.to._meta.pk.to_python
- for pk in field_value:
- if isinstance(pk, unicode):
- pks.append(m2m_convert(pk.encode(options.get("encoding", settings.DEFAULT_CHARSET))))
- else:
- pks.append(m2m_convert(pk))
- m2m_data[field.name] = pks
-
+ m2m_data[field.name] = [m2m_convert(smart_unicode(pk)) for pk in field_value]
+
# Handle FK fields
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
if field_value:
data[field.attname] = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value)
else:
data[field.attname] = None
-
+
# Handle all other fields
else:
data[field.name] = field.to_python(field_value)
-
+
yield base.DeserializedObject(Model(**data), m2m_data)
def _get_model(model_identifier):
@@ -105,5 +100,5 @@ def _get_model(model_identifier):
except TypeError:
Model = None
if Model is None:
- raise base.DeserializationError("Invalid model identifier: '%s'" % model_identifier)
+ raise base.DeserializationError(u"Invalid model identifier: '%s'" % model_identifier)
return Model