使用键入的可选值创建动态 Pydantic 模型
Create dynamic Pydantic model with typed optional values
我想从我的数据创建一个动态模型,从中创建 JSON,然后将其加载到另一个位置。
我找不到以某种方式定义字段的方法,它应该是可选的,但是当该字段存在数据时 - 它会被验证。
这是必填字段:
fields[col_name] = (data_type, None)
# resolve types for data
data_type = resolve_type(data)
required = is_required(data)
if required:
fields[col_name] = (data_type, ...)
else:
fields[col_name] = (data_type, None) <--- unclear
...
pydantic.create_model(name, **fields)
以上配置生成 JSON 模型,使字段成为可选字段和类型,但随后我使用输入数据进行验证,我无法传递 None
值 - '$.inputs.0.Field', 'message': "None is not of type 'string'"
所以我的问题 - 如何声明一个字段来验证输入,但仅当它不是 None 时。
通过这种方式,我可以创建 JSON 架构并将其加载到另一个位置。
根据 https://github.com/samuelcolvin/pydantic/issues/990
中的建议实施了解决方法
optional_fields = list()
if required:
fields[col_name] = (data_type, ...)
else:
fields[col_name] = (data_type, None)
optional_fields.append(col_name)
model = pydantic.create_model(name, **fields)
def schema_extra(schema, model):
for column in optional_fields:
original_type = schema["properties"][column]["type"]
schema["properties"][column].update({"type": ["null", original_type]})
model.__config__.schema_extra = schema_extra
schema_json = model.schema_json()
Foo = create_model("Foo", foo = (int, None))
Foo(foo=None)
# Foo(foo=None)
Foo()
# Foo(foo=None)
Foo(foo=3)
# Foo(foo=3)
这是您想要的结果吗?
我想从我的数据创建一个动态模型,从中创建 JSON,然后将其加载到另一个位置。
我找不到以某种方式定义字段的方法,它应该是可选的,但是当该字段存在数据时 - 它会被验证。
这是必填字段:
fields[col_name] = (data_type, None)
# resolve types for data
data_type = resolve_type(data)
required = is_required(data)
if required:
fields[col_name] = (data_type, ...)
else:
fields[col_name] = (data_type, None) <--- unclear
...
pydantic.create_model(name, **fields)
以上配置生成 JSON 模型,使字段成为可选字段和类型,但随后我使用输入数据进行验证,我无法传递 None
值 - '$.inputs.0.Field', 'message': "None is not of type 'string'"
所以我的问题 - 如何声明一个字段来验证输入,但仅当它不是 None 时。 通过这种方式,我可以创建 JSON 架构并将其加载到另一个位置。
根据 https://github.com/samuelcolvin/pydantic/issues/990
中的建议实施了解决方法optional_fields = list()
if required:
fields[col_name] = (data_type, ...)
else:
fields[col_name] = (data_type, None)
optional_fields.append(col_name)
model = pydantic.create_model(name, **fields)
def schema_extra(schema, model):
for column in optional_fields:
original_type = schema["properties"][column]["type"]
schema["properties"][column].update({"type": ["null", original_type]})
model.__config__.schema_extra = schema_extra
schema_json = model.schema_json()
Foo = create_model("Foo", foo = (int, None))
Foo(foo=None)
# Foo(foo=None)
Foo()
# Foo(foo=None)
Foo(foo=3)
# Foo(foo=3)
这是您想要的结果吗?