Отличить явно переданное значение None в схеме Marshmallow от значения None по умолчанию

1
4

Я работаю с marshmallow-dataclass в моем приложении APIFlask, чтобы получить схемы для моих запросов API. Теперь я хотел бы иметь поле, которое можно оставить пустым, заполнить значением или явно задать None с разным поведением для каждого.

Сейчас у меня есть что-то вроде этого:

Но теперь я не могу отличить, содержал ли исходный JSON {"bar": null} или {}. Я хотел бы провести это различие, сохранив при этом оба JSON-файла действительными, поэтому простого удаления значения по умолчанию недостаточно, поскольку {} больше не будет действительным вводом.

Я нашел один обходной путь, а именно использование какого-либо другого вида синглтона или сигнального элемента в качестве значения по умолчанию:

Однако для меня это имеет два недостатка:

Я попытался исправить проблему 1, оставив значение по умолчанию на None и обнаруживая с помощью хука @post_load, содержали ли исходные данные ключ или нет, чтобы установить его в соответствии со своим пользовательским значением сигнального элемента, но в этот момент мне кажется, что я захожу слишком далеко в кроличью нору, чтобы добиться желаемого. Добавление metadata={"required": False} к вызову field также, похоже, не дало никакого эффекта.

Есть ли способ надежно проверить, присутствовало ли входное значение в исходных данных или использовалось значение по умолчанию?

from marshmallow_dataclass import dataclass

@dataclass
class FooIn:
    bar: str | None = field(default=None)
from marshmallow_dataclass import dataclass

class _Undefined: pass
Undefined = _Undefined()

@dataclass
class FooIn:
    bar: str | None = field(default=Undefined)
Пров
Вопрос задан21 января 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.