пользовательская функция python marshmallow с отсутствующей опцией сохраняет вывод того же значения

#python #marshmallow

#python #marshmallow

Вопрос:

версия python 3.7, marshmallow 3.1.1

 class userSchema(Schema):
    created_datetime = fields.Str(required=False, missing=str(datetime.datetime.now()))
    name = fields.Str()

for i in range(3):
    time.sleep(5)
    user_data = {"name": "test"}
    test_load = userSchema.load(user_data)
    print(test_load)
  

Я обнаружил, что все загруженные данные имеют одинаковое значение created_datetime, тогда как я ожидаю, что они будут разными.
Это тот случай, когда отсутствует и значение по умолчанию может быть только фиксированным значением?

Ответ №1:

Вам необходимо предоставить вызываемый объект, который не принимает никаких аргументов для генерации динамического значения по умолчанию / отсутствующего значения. Например, используя приведенный выше код:

 from marshmallow import Schema, feilds
from datetime import datetime, timezone


def datetime_str_now():
    """ create timezone aware datetime """
    return datetime.now(
        tz=timezone.utc  # remove this if you don't need timezone aware dates
    ).isoformat()

class userSchema(Schema):
    created_datetime = fields.Str(
        required=False,
        missing=datetime_str_now
    )
    name = fields.Str()

for i in range(3):
    time.sleep(5)
    user_data = {"name": "test"}
    test_load = userSchema().load(user_data)
    print(test_load)

""" Outputs:
{'created_datetime': '2020-10-07T09:08:00.847929 00:00', 'name': 'test'}
{'created_datetime': '2020-10-07T09:08:01.851066 00:00', 'name': 'test'}
{'created_datetime': '2020-10-07T09:08:02.854573 00:00', 'name': 'test'}
"""