Django использует метод поля value_to_string
для предоставления строкового представления в сериализаторе. Таким образом, вы можете определить подкласс настраиваемого поля, который переопределяет этот метод:
class MyDateTimeField(DateTimeField)
def value_to_string(self, obj):
val = self._get_val_from_obj(obj)
if val is None:
data = ''
else:
data = val.isoformat()
return data
Отредактированный
Ааа, похоже, я искал не в том месте. Метод serializers.python.Serializer.handle_field
фактически проверяет поля даты и времени и передает их без изменений в кодировщик JSON. Так что это тот кодер, который нам на самом деле нужно переопределить.
class MyJSONEncoder(DjangoJSONEncoder):
def default(self, o):
if isinstance(o, datetime.datetime):
return o.isoformat()
else:
return super(MyJSONEncoder, self).default(o)
К сожалению, wadofstuff
жестко кодирует исходный кодер DjangoJSONEncoder, поэтому нам также потребуется переопределить сериализатор.
from wadofstuff.django.serializers.json import Serializer
class BetterSerializer(Serializer):
"""
Convert a queryset to JSON.
"""
def end_serialization(self):
"""Output a JSON encoded queryset."""
self.options.pop('stream', None)
self.options.pop('fields', None)
self.options.pop('excludes', None)
self.options.pop('relations', None)
self.options.pop('extras', None)
simplejson.dump(self.objects, self.stream, cls=MyJSONEncoder,
**self.options)