Flask-Restplus如何建模字符串列表或对象列表类型的属性?
在Flask-Restplus中建模多类型列表属性
嘿,这个场景我之前在做Flask-Restplus项目时也遇到过,要建模一个既可以是字符串列表又可以是对象列表的属性,其实用fields.OneOf配合fields.List就能轻松搞定,具体操作步骤如下:
1. 定义嵌套对象的子模型
首先,先把那个带name和foo字段的对象模型定义出来,后续会用到它:
from flask_restplus import Api, fields # 初始化Api实例 api = Api() # 定义嵌套的对象模型 item_object_model = api.model('ItemObject', { 'name': fields.String(required=True, description='The item name'), 'foo': fields.String(required=True, description='Additional field for the object') })
2. 定义单个元素的可选类型
接下来,我们需要一个能接受字符串或者上述对象的字段类型,这里用fields.OneOf来指定多种可选类型:
# 定义单个元素的允许类型:字符串或嵌套对象 item_type = fields.OneOf([ fields.String(description='Plain string value'), fields.Nested(item_object_model, description='Object with name and foo fields') ], description='Can be either a plain string or an object')
3. 构建包含多类型列表的主模型
最后,在主模型中将my_attribute定义为这个可选类型的列表即可:
# 主模型,包含可以是字符串列表或对象列表的my_attribute main_model = api.model('MainModel', { 'my_attribute': fields.List(item_type, required=True, description='List containing strings or objects') })
验证效果
现在这个模型就能完美兼容两种格式的输入/输出了:
字符串列表格式
{ "my_attribute": ["value1", "value2"] }
对象列表格式
{ "my_attribute": [ {"name": "value1", "foo": "something"}, {"name": "value2", "foo": "something else"} ] }
如果你的Flask-Restplus版本比较老旧(比如低于0.13.0),可能没有fields.OneOf,这种情况下可以自定义一个继承自fields.Raw的字段,在validate方法里手动校验类型,但fields.OneOf无疑是最简洁的方案。
内容的提问来源于stack exchange,提问作者adib
相关产品推荐
相关产品推荐

