Marshmallow - как использовать загруженные данные при проверке

Я создаю API, используя зефир для проверки данных.

данные передаются в схему в формате JSON:

data = request.get_json()
schema = ItemSchema()
evaluated = schema.load(data)

if evaluated.errors:
            return {'message': evaluated.errors}, 400

В схеме есть методы проверки полей, которые украшены декоратором @validates:

@validates('name')
def validate_name(self, name):
    existing_item = ItemModel.name_exists(name) #returns an object of type Item if the name exists. Names are unique
    if existing_item and existing_item._id !=  data['_id']:
        raise ValidationError('Item already exists.')

Как и в этом примере, я хотел бы получить доступ к словарю данных, который передается через функцию загрузки. Как я могу получить доступ к объекту данных внутри метода проверки схемы?

Спасибо за вашу помощь!


person BetterSaveThanSorry    schedule 19.09.2018    source источник


Ответы (1)


Чтобы ответить на ваш вопрос, вы можете использовать валидатор схемы с декоратором @validates_schema. У него есть параметр pass_original.

@validates_schema(pass_original=True)
def validate_name(self, data, input_data):
    existing_item = ItemModel.name_exists(data['name'])
    if existing_item and existing_item._id !=  input_data['_id']:
        raise ValidationError('Item already exists.')

Но, честно говоря, я думаю, что ваш вариант использования неверен.

Если это создание элемента (POST), просто проверьте, существует ли уже имя.

Если это модификация элемента (PUT), вы знаете идентификатор из пути запроса. И у вас должна быть возможность получить к нему доступ из вашего объекта.

Кроме того, если я могу предложить, вы можете использовать веб-аргументы (поддерживаемые разработчиками зефира) для легкого анализа запроса с помощью зефира.

person Jérôme    schedule 18.10.2018