Fixed a bug introduced in [6891]: the "safe" YAML serializer can't handle time types out of the box. I've worked around the bug by coercing times to strings,

which is far from perfect. However, it's better than a Python-specific "!!python/time" type which would break interoperability (which was the goal of switching to the safe mode in the first place).


git-svn-id: http://code.djangoproject.com/svn/django/trunk@6893 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jacob Kaplan-Moss 2007-12-04 21:35:28 +00:00
parent b65fce6595
commit 5684bdc3a4
1 changed files with 14 additions and 0 deletions

View File

@ -5,6 +5,7 @@ Requires PyYaml (http://pyyaml.org/), but that's checked for in __init__.
"""
import datetime
from django.db import models
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer
try:
@ -17,6 +18,19 @@ class Serializer(PythonSerializer):
"""
Convert a queryset to YAML.
"""
def handle_field(self, obj, field):
# A nasty special case: base YAML doesn't support serialization of time
# types (as opposed to dates or datetimes, which it does support). Since
# we want to use the "safe" serializer for better interoperability, we
# need to do something with those pesky times. Converting 'em to strings
# isn't perfect, but it's better than a "!!python/time" type which would
# halt deserialization under any other language.
if isinstance(field, models.TimeField) and getattr(obj, field.name) is not None:
self._current[field.name] = str(getattr(obj, field.name))
else:
super(Serializer, self).handle_field(obj, field)
def end_serialization(self):
self.options.pop('stream', None)
self.options.pop('fields', None)