Найти - Пользователи
Полная версия: datetime проблема сериализации
Начало » Django » datetime проблема сериализации
1
remoshka
Преамбула: хочу реализовать пагинацию данных с помощью ajax, чтобы выводить много данных в графике.
Суть:
Есть модель

 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 ? Как вообще поступить в этой ситуации ?
remoshka
Вот это не имеет поддержки django 2.0+ https://github.com/myyang/django-unixtimestampfield
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB