Flask-restplus:如何使用“allOf”操作定义嵌套模型?

Posted

技术标签:

【中文标题】Flask-restplus:如何使用“allOf”操作定义嵌套模型?【英文标题】:Flask-restplus: how to define a nested model with 'allOf' operation? 【发布时间】:2018-03-10 02:00:04 【问题描述】:

创建一个 python flask rest plus 服务器应用程序, 我正在尝试使用 'allOf' 运算符为输入主体(在 POST 操作中)创建模型, 这等效于以下示例,取自我使用 swagger 编辑器创建的 swagger.yaml:

definitions:
  XXXOperation:
    description: something...
    properties:
      oper_type:
      type: string
        enum:
          - oper_a
          - oper_b
          - oper_c
      operation:
        allOf:
          - $ref: '#/definitions/OperA'
          - $ref: '#/definitions/OperB'
          - $ref: '#/definitions/OperC'

应该是这样的(只是在我疯狂的想象中):

xxx_oper_model = api.model('XXXOperation', 
    'oper_type': fields.String(required=True, enum['oper_a', 'oper_b', 'oper_c']),
    'operation': fields.Nested([OperA, OperB, OperC], type='anyof')
)

当 OperA、OperB、OperC 也被定义为模型时。 我该怎么做?

实际上,我更喜欢使用 'oneOf',但据我所知,即使在 swagger 编辑器中也不支持它,所以我尝试将 'allOf' 与非必填字段。

版本:flask restplus:0.10.1,flask:0.12.2,python:3.6.2

非常感谢

【问题讨论】:

【参考方案1】:

您需要使用api.inherit。如documentation示例第30页所述;

parent = api.model('Parent', 
  'name': fields.String,
  'class': fields.String(discriminator=True)
)

child = api.inherit('Child', parent, 
  'extra': fields.String
)

这样,Child 将拥有 Parent 的所有属性 + 自己的附加属性 extra


  "Child": 
    "allOf": [
      
        "$ref": "#/definitions/Parent"
      ,
      
        "properties": 
          "extra": 
            "type": "string"
          
        
      
    ]
  

【讨论】:

以上是关于Flask-restplus:如何使用“allOf”操作定义嵌套模型?的主要内容,如果未能解决你的问题,请参考以下文章

flask-restplus 知识点

Flask-RESTPlus系列Part2:响应编组

Flask-RESTPlus系列Part3:请求解析

使用flask-restplus在flask-SQLAlchemy中创建多对多关联表时出错

Flask 学习-41.Flask-RESTPlus 入门到放弃

Flask 学习-49.Flask-RESTX 使用 namespaces 命名空间