Суть:
Есть модель
date = models.DateTimeField(blank=True, auto_now_add=True)
<QuerySet [{'some': 123, 'date': datetime.datetime(2018, 5, 29, 1, 21, 35, 861400, tzinfo=<UTC>)
Для того, чтобы передать это клиенту, надо данные сериализовать в json. Вот тут начинается проблема. Дело в том, что сериализаторы типа json.dumps()/simplejson.dumps() не принимают datetime.datetime(2018, 5, 29, 1, 21, 35, 861400, tzinfo=<UTC>). Им строки подавай. Поэтому найден финт
def myconverter(o): if isinstance(o, datetime.datetime): return o.__str__() obj_all = Some.objects.values()[0:3] json.dumps(obj_all, default=myconverter)
Но это не работает. json.dumps() возвращает null
Второй вариант, в settings указать(последние две строки) заставить джангу datetimefield отдавать как unixtime
# TIME_ZONE = 'UTC' TIME_ZONE = 'Europe/Moscow' USE_I18N = True USE_L10N = True USE_TZ = True DATETIME_FORMAT = "U" DATETIME_INPUT_FORMATS = ("%s",)
Это тоже не работает. В queryset как был ‘date’: datetime.datetime(2018, 5, 29, 1, 21, 35, 861400, tzinfo=<UTC>), так и остался.
Третий вариант заюзать pre_save:
class UCDateTimeField(DateTimeField): def pre_save(self, model_instance, add): if self.auto_now or (self.auto_now_add and add): value = datetime.datetime.now() setattr(model_instance, self.attname, value) return value else: value = getattr(model_instance, self.attname) if not isinstance(value, datetime): # assume that the value is a timestamp if it is not a datetime value = datetime.fromtimestamp(int(value)) # an exception might be better than an assumption setattr(model_instance, self.attname, value) return super(UCDateTimeField, self).pre_save(model_instance, add)
date = UCDateTimeField(blank=True, auto_now_add=True)
Тоже не работает.
Вопрос: как пофиксить эту штуку ? Или может вместо datetimefield заюзать charfield и вручную конвертировать текущее время в unixtime ? Как вообще поступить в этой ситуации ?