Десериализация даты в Marshmallow

#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 не рассматривало бы его как дату и время.