Схема Marshmallow: разрешить любое дополнительное поле, если его имя соответствует шаблону - PullRequest
0 голосов
/ 07 мая 2020

Я создаю конечную точку API и использую Marshmallow для проверки ввода и маршалинга. Один из объектов, который я хочу принять, имеет несколько специальных полей c, но также принимает дополнительные поля, если имя поля начинается с x-. Так, например:

{
  "name": "Bob Paulson",  // a strict, required field
  "email": "bob@example.com",  // a strict, required field
  "x-dob": "1980-10-11" // not a part of the explicit schema but accepted because it begins with 'x-'
}

Есть ли способ указать это в Marshmallow?

1 Ответ

3 голосов
/ 07 мая 2020

Вы можете использовать @pre_load, чтобы поместить эти поля в поле extras (например), которое может содержать любые данные, которые вы хотите, см. Документацию Marshmallow о Расширение схемы .

from marshmallow import Schema, fields, ValidationError, pre_load


class PersonSchema(Schema):
    name = fields.Str()
    email = fields.Str()
    extra = fields.Dict()

    @pre_load
    def unwrap_envelope(self, data, **kwargs):
        extra = {}
        rest = {}
        for k, v in data.items():
          if k.startswith('x-'):
            extra[k] = v
          else:
            rest[k] = v
        return {'extra':extra,**rest}


sch = PersonSchema()
person_data = {"name": "John Doe", "email": "jdoe@email.com"}

try:
  res1 = sch.load({**person_data,"dob": "1980-11-11"})
  print(res1)
except ValidationError as err:
  print(err.messages)

try:
  res2 = sch.load({**person_data,"x-dob": "1980-11-11"})
  print(res2)
except ValidationError as err:
  print(err.messages)

Вышеупомянутое должно завершиться ошибкой при первом отпечатке и успешным при втором. См. Демонстрацию здесь .

...