#python #date-formatting #marshmallow
#python #дата-форматирование #marshmallow
Вопрос:
У меня есть таблица (START_DATE , ТЕКСТ, ДЕСЯТИЧНАЯ, ЦЕЛОЧИСЛЕННАЯ). Я считываю данные из базы данных и пытаюсь де сериализовать данные.
class Response(Schema):
class Meta:
json_module = simplejson
data = fields.List(fields.List(fields.Raw()))
Ответ:
"data": [
[
"Tue, 26 Jan 2021 00:00:00 GMT",
"USD",
78790.400000,
79262
],
[
"Mon, 25 Jan 2021 00:00:00 GMT",
"USD",
68852.340000,
77365
]
Как я могу изменить формат даты на ‘%Y-%m-%dT%H:%M:%S%z’
Я внес нижеприведенные изменения, но формат даты не изменился.
class Response(Schema):
class Meta:
json_module = simplejson
dateformat = '%Y-%m-%dT%H:%M:%S%z'
data = fields.List(fields.List(fields.Raw()))
Ответ №1:
Формат даты не будет применяться волшебным образом к любой строке, похожей на данные.
Вам необходимо указать поля для каждого значения.
Из вашего примера ваша схема может выглядеть следующим образом
class Response(Schema):
data = fields.Tuple((
fields.DateTime(format='%Y-%m-%dT%H:%M:%S%z'),
fields.String(),
fields.Float(),
fields.Integer(),
))
Комментарии:
1. Данные в вопросе поступают из базы данных. Для простоты я изменил ограничение столбца на 4. Данные, поступающие из базы данных, содержат более 100 столбцов. Все столбцы автоматически идентифицируются с помощью field.raw . Мой вопрос в том, когда marshmallow идентифицирует тип как dateformat вместо обычного dateformat, можем ли мы изменить его на что-то пользовательское. Предложение, которое вы предоставляете, является правильным, когда мы заранее знаем тип столбца и их тип. Но в моем случае список столбцов огромен, и мы запрашиваем из многих разных таблиц.
2. Хорошо, я совершенно забыл о функции предполагаемого поля. Но это применимо только к полям, объявленным в Meta, таким как fields = (‘дата рождения’, ‘имя’).
3. Здесь вы используете необработанное поле, и данные передаются как есть, и marshmallow ничего не знает о его типе. Я думаю, что он отображается как строка datetime, потому что именно так будет выглядеть str(data), а не потому, что marshmallow сериализует его как datetime .
4. Спасибо, Джером. Похоже, что мы ничего не можем сделать на стороне marshmallow. База данных форматирует дату-время и отправляет ее в виде строки.
5. Боюсь, что так. Я удивлен, что драйвер не возвращает объект datetime. Но даже если бы это было так, необработанное поле marshmallow не рассматривало бы его как дату и время.