Переопределить схему поля на основе данных - Зефир - PullRequest
0 голосов
/ 12 апреля 2019

Я только начинаю с зефира, так что, если есть более элегантный способ решить проблему, пожалуйста, дайте мне знать.Поля будут варьироваться в зависимости от типа пользователя (студент / персонал)

{
   "type": "student",   
   "name": "Student 1",
   "class": "V Std",
   "section": "A Class"
}

, если тип Staff, нам нужно проверить designation и experience, пропустить class и section

{
   "type": "staff",   
   "name": "Staff 1",
   "designation": "Professor",
   "experience": "2 Year"
}

У меня есть следующая простая модель и схема.

class AddUser(Resource):
   def post(self):
      content = request.get_json(silent=True)
      try:
         data = UserSchema().load(content)       
         print(data)

      except ValidationError as err:
         return err.messages, 400

class UserSchema(Schema):
   type = fields.Str(required=True,validate=OneOf(['student', 'staff'], error='Invalid User Type'), error_messages={'required': 'User type required'})
   name = fields.Str(required=True)
   class = fields.Str()
   section = fields.Str()
   designation = fields.Str()
   experience = fields.Str()

   @post_load
   # @pre_load
   # @validates_schema
   def unwrap_envelope(self, data):   
     student = {
       class: fields.Str(required=True),
       section: fields.Str(required=True)
     }

      staff = {
       designation: fields.Str(required=True),
       experience: fields.Str(required=True)
     }

     # Fields are getting updated but it is **not raising the error**

     if data['type'] == 'student':
       self.declared_fields.update(student)
     elseif data['type'] == 'staff':
       self.declared_fields.update(staff)

     return data

1 Ответ

1 голос
/ 14 апреля 2019

Я думаю, что вы ищете полиморфизм.

Достигнуть этого непросто, и зефир не дает простого способа сделать это.Вы можете проверить зефир-однофсхема и зефир-полиполе .Эти две сторонние библиотеки предназначены для этого.У них обоих есть свои плюсы и минусы, поэтому ни один из них не был включен в ядро ​​зефира.

...