Author: russellm
Date: 2007-03-12 19:59:34 -0500 (Mon, 12 Mar 2007)
New Revision: 4718
Modified:
django/trunk/django/core/serializers/base.py
django/trunk/django/core/serializers/python.py
django/trunk/django/core/serializers/xml_serializer.py
Log:
Added various fixes to serializer implementations. Fixes mostly deal with
handling nulls, non-integer primary key values (e.g., OneToOne fields or
strings), and reconstruction of primary key references in related fields.
Modified: django/trunk/django/core/serializers/base.py
===================================================================
--- django/trunk/django/core/serializers/base.py 2007-03-13 00:35:47 UTC
(rev 4717)
+++ django/trunk/django/core/serializers/base.py 2007-03-13 00:59:34 UTC
(rev 4718)
@@ -54,11 +54,7 @@
Convert a field's value to a string.
"""
if isinstance(field, models.DateTimeField):
- value = getattr(obj, field.name)
- if value is None:
- value = ''
- else:
- value = value.strftime("%Y-%m-%d %H:%M:%S")
+ value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(field, models.FileField):
value = getattr(obj, "get_%s_url" % field.name, lambda: None)()
else:
Modified: django/trunk/django/core/serializers/python.py
===================================================================
--- django/trunk/django/core/serializers/python.py 2007-03-13 00:35:47 UTC
(rev 4717)
+++ django/trunk/django/core/serializers/python.py 2007-03-13 00:59:34 UTC
(rev 4718)
@@ -57,7 +57,7 @@
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 : d["pk"]}
+ data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
m2m_data = {}
# Handle each field
@@ -70,16 +70,17 @@
# 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(pk.encode(options.get("encoding",
settings.DEFAULT_CHARSET)))
+
pks.append(m2m_convert(pk.encode(options.get("encoding",
settings.DEFAULT_CHARSET))))
else:
- pks.append(pk)
+ pks.append(m2m_convert(pk))
m2m_data[field.name] = pks
# Handle FK fields
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
- data[field.attname] = field_value
+ data[field.attname] =
field.rel.to._meta.pk.to_python(field_value)
# Handle all other fields
else:
Modified: django/trunk/django/core/serializers/xml_serializer.py
===================================================================
--- django/trunk/django/core/serializers/xml_serializer.py 2007-03-13
00:35:47 UTC (rev 4717)
+++ django/trunk/django/core/serializers/xml_serializer.py 2007-03-13
00:59:34 UTC (rev 4718)
@@ -57,10 +57,12 @@
})
# Get a "string version" of the object's data (this is handled by the
- # serializer base class). None is handled specially.
- value = self.get_string_value(obj, field)
- if value is not None:
+ # serializer base class).
+ if getattr(obj, field.name) is not None:
+ value = self.get_string_value(obj, field)
self.xml.characters(str(value))
+ else:
+ self.xml.addQuickElement("None")
self.xml.endElement("field")
@@ -127,7 +129,8 @@
pk = node.getAttribute("pk")
if not pk:
raise base.DeserializationError("<object> node is missing the 'pk'
attribute")
- data = {Model._meta.pk.name : pk}
+
+ data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)}
# Also start building a dict of m2m data (this is saved as
# {m2m_accessor_attribute : [list_of_related_objects]})
@@ -148,17 +151,20 @@
# As is usually the case, relation fields get the special
treatment.
if field.rel and isinstance(field.rel, models.ManyToManyRel):
- m2m_data[field.name] = self._handle_m2m_field_node(field_node)
+ m2m_data[field.name] = self._handle_m2m_field_node(field_node,
field)
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
- data[field.attname] = self._handle_fk_field_node(field_node)
+ data[field.attname] = self._handle_fk_field_node(field_node,
field)
else:
- value =
field.to_python(getInnerText(field_node).strip().encode(self.encoding))
+ if len(field_node.childNodes) == 1 and
field_node.childNodes[0].nodeName == 'None':
+ value = None
+ else:
+ value =
field.to_python(getInnerText(field_node).strip().encode(self.encoding))
data[field.name] = value
# Return a DeserializedObject so that the m2m data has a place to live.
return base.DeserializedObject(Model(**data), m2m_data)
- def _handle_fk_field_node(self, node):
+ def _handle_fk_field_node(self, node, field):
"""
Handle a <field> node for a ForeignKey
"""
@@ -166,13 +172,16 @@
if len(node.childNodes) == 1 and node.childNodes[0].nodeName == 'None':
return None
else:
- return getInnerText(node).strip().encode(self.encoding)
+ return field.rel.to._meta.pk.to_python(
+ getInnerText(node).strip().encode(self.encoding))
- def _handle_m2m_field_node(self, node):
+ def _handle_m2m_field_node(self, node, field):
"""
Handle a <field> node for a ManyToManyField
"""
- return [c.getAttribute("pk").encode(self.encoding) for c in
node.getElementsByTagName("object")]
+ return [field.rel.to._meta.pk.to_python(
+ c.getAttribute("pk").encode(self.encoding))
+ for c in node.getElementsByTagName("object")]
def _get_model_from_node(self, node, attr):
"""
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---