Я могу изменить значение по умолчанию __str__()
функция объекта datetime.datetime? По умолчанию это возвращает что-то как '2010-06-28 12:43:56.985790'
, и мне нужен он для печати чего-то как '2010-06-28T12:44:21.241228'
(который является изоформатом () функция).
Мне нужно это для сериализации JSON django модели.
Моя модель:
class Transport(models.Model):
user = models.ForeignKey(User)
source = models.ForeignKey(Marker, related_name="source_marker")
destination = models.ForeignKey(Marker, related_name="destination_marker")
object = models.CharField(choices=possesion_choices, max_length=2**6)
quantity = models.IntegerField()
time_sent = models.DateTimeField()
time_arrived = models.DateTimeField()
И когда я сериализирую его (использование wadofstuff модуля), это печатает что-то как
print serializers.serialize('json', Transport.objects.all(), relations=('source', 'destination',) indent=4)
[
{
"pk": 1,
"model": "main.transport",
"fields": {
[.. bla bla ..]
"time_sent": "2010-06-28 12:18:05",
"time_arrived": "2010-06-28 12:38:36",
[.. bla bla ..]
}
}
]
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)