当前位置: 首页 > 知识库问答 >
问题:

在Swagger 2.0中定义多个模型的数组

燕宏胜
2023-03-14

这是我第一次涉足斯威格,所以请温柔点。

我有以下定义:

definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          $ref: '#/definitions/Indicator'
  Indicator:
    type: object
    properties:
      type:
        type: string
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
  BBANDS:
    properties:
      type:
        type: string
        default: BBANDS
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
        properties:
          timeperiod:
            type: integer
            format: int32
            default: 5
          nbdevup:
            type: integer
            format: int32
            default: 2
          nbdevdn:
            type: integer
            format: int32
            default: 2
          matype:
            type: integer
            format: int32
            default: 0
  DEMA:
    properties:
      type:
        type: string
        default: DEMA
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
        properties:
          timeperiod:
            type: integer
            format: int32
            default: 5

因此,Payload有一个名为indicator的属性,它是indicator的数组。BBANDSDEMAindicator类型的模型(我知道这不会转化为招摇)。我想做的是定义一个带有默认值的实际模型数组,在本例中是BBANDSDEMA。大概是这样的:

definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          - '#/definitions/BBANDS'
          - '#/definitions/DEMA'

definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          - $ref '#/definitions/BBANDS'
          - $ref '#/definitions/DEMA'

当然,两者都不起作用。原因是,虽然Signator模型正确地描述了指标,但不同的指标可以具有不同的参数集。

有没有一种方法可以从本质上定义几个模型的列表,或者将BBANDSDEMA模型映射到指标中?


共有2个答案

任云瀚
2023-03-14

数组类型中的AFAIK可以保存一个类型,如果您希望在一个数组下有多个类型,则需要定义另一个超级类型并将子类型包装在其中(可能使用对象类型),如下面所示。这是因为swagger-2.0不支持json模式的所有功能。org、oneOfanyOfallOf等都是其中的一部分。

但是您可以使用swagger-2.0提供的第三方扩展选项。其中,您可以使用x-命名键,这意味着您可以像x-oneOf一样包含这些oneOf,在解析模式时,您可以使用json模式解析器和swagger模式解析器来完成。

下面给出了一个这样的例子,

Json模式

json prettyprint-override">{
  "id": "http://some.site.somewhere/entry-schema#",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "description": "schema for an fstab entry",
  "type": "object",
  "required": [
    "storage"
  ],
  "properties": {
    "storage": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/diskDevice"
        }
      ]
    },
    "deviceList": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/definitions/Device"
      }
    }
  },
  "definitions": {
    "diskDevice": {
      "type": "object",
      "properties": {
        "label": {
          "type": "string"
        }
      },
      "required": [
        "label"
      ]
    },
    "blockDevice": {
      "type": "object",
      "properties": {
        "blockId": {
          "type": "number"
        }
      },
      "required": [
        "blockId"
      ]
    },
    "CharDevice": {
      "type": "object",
      "properties": {
        "charDeviceName": {
          "type": "string"
        }
      },
      "required": [
        "charDeviceName"
      ]
    },
    "Device": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/diskDevice"
        },
        {
          "$ref": "#/definitions/blockDevice"
        },
        {
          "$ref": "#/definitions/CharDevice"
        }
      ]
    }
  }
}

数据或有效载荷

{
"storage": {"label": "adsf"},
"deviceList": [{"label": "asdf"}, {"blockId": 23}, {"charDeviceName": "asdf"}]
}

使用这个网站来玩你的样本数据-http://www.jsonschemavalidator.net/

请注意deviceList属性及其构造方式。希望这对你有帮助。

黎鹤轩
2023-03-14
匿名用户

Swagger/OpenAPI 2.0不支持的多种类型,但是有几种方法可以描述您需要的内容。

只要有一个字段在模型之间是通用的,并且可以用来区分它们,就可以使用模型继承:

https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaDiscriminator https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#composition-遗传多态

在您的示例中,此属性是typetype="BBANDS"type="DEMA")。所以你可以:

  • 通过使用allOf继承BBANDSDEMA模型。
  • 添加鉴别器:类型指示符,以指示将使用类型属性来区分子模型。
  • 定义Payload作为一个数组的Signator。这样,它实际上可以是一个BBANDS数组或一个DEMA数组。
definitions:
  Payload:
    type: object
    properties:
      indicators:
        type: array
        items:
          $ref: '#/definitions/Indicator'

  Indicator:
    type: object
    properties:
      type:
        type: string
        # Limit the possible values if needed
        #enum:
        #  - BBANDS
        #  - DEMA
      computeOn:
        type: array
        items:
          type: string
        default:
          - close

    # The "type" property will be used to distinguish between the sub-models.
    # The value of the "type" property MUST be the schema name, that is, "BBANDS" or "DEMA".
    # (Or in other words, the sub-model schema names must match possible values of "type".)
    discriminator: type
    required:
      - type

  BBANDS:
    allOf:
      - $ref: '#/definitions/Indicator'
      - type: object
        properties:
          parameters:
            type: object
            properties:
              timeperiod:
                type: integer
                format: int32
                default: 5
              nbdevup:
                type: integer
                format: int32
                default: 2
              nbdevdn:
                type: integer
                format: int32
                default: 2
              matype:
                type: integer
                format: int32
                default: 0
  DEMA:
    allOf:
      - $ref: '#/definitions/Indicator'
      - type: object
        properties:
          parameters:
            type: object
            properties:
              timeperiod:
                type: integer
                format: int32
                default: 5

如果所有参数都是整数,则可以使用定义为hashmap的参数的单个模型Signator。但是在这种情况下,您将失去为特定指标类型定义确切的参数的能力。

definitions:
  Indicator:
    type: object
    properties:
      type:
        type: string
        enum:
          - BBANDS
          - DEMA
      computeOn:
        type: array
        items:
          type: string
        default:
          - close
      parameters:
        type: object
        properties:
          # This is a common parameter in both BBANDS and DEMA
          timeperiod:
            type: integer
            format: int32
            default: 5
        # This will match additional parameters "nbdevup", "nbdevdn", "matype" in BBANDS
        additionalProperties:
          type: integer

 类似资料:
  • 英文原文:http://emberjs.com/guides/models/defining-models/ 模型是一个定义了需要呈现给用户的数据的属性和行为的类。任何用户往返于应用(或者刷新页面)能看到的内容都需要使用模型来表示。 应用中所有的模型,都继承与DS.Model: 1 App.Person = DS.Model.extend(); 在定义了一个模型类之后,就可以开始查询或者创建一

  • 我们要定义一个模型,首先我们会用到define, 它的返回值类似是 Model<TInstance, TAttributes> 。 define<TInstance, TAttributes>(modelName: string, attributes: DefineAttributes, options?: DefineOptions<TInstance>): Model

  • 问题内容: 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;admin模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,则两个模型将同步到默认数据库。 如果我在命令中设置数据库,例如,则两个模型将同步到数据库B。 所以我的问题是,如何将两个模型同步到两个数据库? 问题答案: 我完全同意@alecxe使用数据库路由器。我目前正在使用一个管理界面来管理多个数据库

  • 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;管理模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,这两个模型将同步到默认数据库。 如果我在命令中设置数据库,比如,那么这两个模型将同步到数据库B。 所以我的问题是,如何将这两个模型同步到两个数据库?

  • 问题内容: 我想将Mongoose模型分离到一个单独的文件中。我试图这样做: 然后,我尝试使用如下模型: 在单独的模块中引用模型是否合理? 问题答案: 基本方法看起来很合理。 作为一种选择,您可以考虑集成模型和控制器功能的“提供商”模块。这样,您可以让app.js实例化提供程序,然后可以执行所有控制器功能。app.js只需指定要实现的具有相应控制器功能的路由即可。 为了进一步整理,您还可以考虑使用

  • 在模型中定义属性,会生成表中的字段 django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列 属性命名限制 不能是python的保留关键字 由于django的查询方式,不允许使用连续