from pydantic import BaseModel


class ModelTypeError(Exception):
    pass


class ModelAttrError(Exception):
    pass


class MyBaseModel(BaseModel):
    """
    带类型和只读属性拦截
        a: int = Field(read_only=True)
    """

    def __setattr__(self, key, value):
        fields = self.__fields__
        field = fields.get(key) or dict()
        extra = field.field_info.extra

        if extra.get("read_only"):
            raise ModelTypeError("Read only field:{}".format(key))
        if field.type_ != type(value):
            raise ModelAttrError("Field type error:{}".format(key))
        super.__setattr__(self, key, value)

测试代码

class A(MyBaseModel):
    a: int = Field(read_only=True)
    b: int = Field(read_only=False)



a = A(a=45, b=34)
a.a = 3
print(a.a)

a.b = "3"
print(a.b)

a.b = 88
print(a.b)

print(a.json())

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2023-03-15
  • 2022-12-23
  • 2021-12-31
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-29
  • 2022-12-23
  • 2021-07-05
  • 2021-08-12
  • 2022-12-23
相关资源
相似解决方案