如何从架构中排除 pydantic 字段?

问题描述 投票:0回答:1

pydantic 类中的一些字段实际上是内部表示,而不是我想要序列化或放入模式中的内容。我正在尝试各种方法来排除它们,但似乎没有任何效果。

这是我使用

exclue=True
exclude_schema=True
Field

的一种方法
class MyItem(BaseModel):
    name: str = Field(...)
    data: str = Field(...)

class MyObject(BaseModel):
    items_dict: dict[str, MyItem] = Field(..., exclude=True, exclude_schema=True)
    
    @property
    def items_list(self):
      return list(self.items_dict.values())

    @root_validator(pre=True)
    @classmethod
    def encode_decode_items(cls, values):
        items = values.get('items_dict')
        if isinstance(items, dict):
            values['items_dict'] = list(items.values())
        elif isinstance(items, list):
            values['items_dict'] = validate_items(items)
        return values

obj = MyObject(items_dict=[MyItem(name='item1', data='data1'), MyItem(name='item2', data='data2')])

print(json.dumps(obj.model_json_schema(), indent=2))

但是在模式中该字段仍然存在:

{
  "$defs": {
    "MyItem": {
      "properties": {
        "name": {
          "title": "Name",
          "type": "string"
        },
        "data": {
          "title": "Data",
          "type": "string"
        }
      },
      "required": [
        "name",
        "data"
      ],
      "title": "MyItem",
      "type": "object"
    }
  },
  "properties": {
    "items_dict": {
      "additionalProperties": {
        "$ref": "#/$defs/MyItem"
      },
      "exclude_schema": true,
      "title": "Items Dict",
      "type": "object"
    }
  },
  "required": [
    "items_dict"
  ],
  "title": "MyObject",
  "type": "object"
}
python pydantic pydantic-v2
1个回答
0
投票

如果您希望从 JSON 架构中排除某个字段,请使用 SkipJsonSchema:

from pydantic.json_schema import SkipJsonSchema
from pydantic import BaseModel

class MyModel(BaseModel):
    visible_in_sch: str 
    not_visible_in_sch: SkipJsonSchema[str]

您可以在docs中了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.