使用非关键字参数 (a.k.a *args) 初始化 FastAPI BaseModel
Initialize FastAPI BaseModel using non keywords arguments (a.k.a *args)
我有一个 FastApi
项目,我正在尝试使用 python 元组进行初始化,
from pydantic import BaseModel
class Item(BaseModel):
name: str = ""
surname: str = ""
data = ("jhon", "dhon")
Item(*data)
输出如下错误
TypeError: __init__() takes 1 positional argument but 3 were given
有没有办法从元组初始化 BaseModel
?
不可以,Pydantic 模型只能使用关键字参数进行初始化。如果你绝对必须从位置参数初始化它,你可以看看模式:
>>> Item(**dict(zip(Item.schema()["properties"], data)))
Item(name='jhon', surname='dhon')
我写了一个可以从元组加载数据的辅助函数,但是
def fill_model(model: BaseModel, columns: List, row: Tuple) -> BaseModel:
base_model = model()
model_keys = base_model.dict().keys()
fields_count = len(model_keys)
if fields_count != len(columns):
raise ValueError("Columns length doesn't match fields count")
if not set(columns).issubset(model_keys):
raise ValueError("Columns doesn't match model fields")
if fields_count != len(row):
raise ValueError("Data length doesn't match fields count")
return model(**{k: v for k, v in zip(columns, row)})
您还可以使用 pydantics BaseModel parse_obj 函数:Item.parse_obj(some_dict)。
但是,您需要编写包装函数/使用 class.
中的键
from pydantic import BaseModel
class Item(BaseModel):
name: str = ""
surname: str = ""
data = ("jhon", "dhon")
fields = Item.__fields__.keys()
zipped_dict = dict(zip(fields, data))
item = Item.parse_obj(zipped_dict)
这样做的好处是,鉴于您的元组始终包含正确的数据,因此在项目 class 中拥有更多条目非常容易处理。
此解决方案将项目 class 的属性与数据元组中的条目压缩在一起。将其转换为字典,可以使用 pydantics parse_obj 函数。
我有一个 FastApi
项目,我正在尝试使用 python 元组进行初始化,
from pydantic import BaseModel
class Item(BaseModel):
name: str = ""
surname: str = ""
data = ("jhon", "dhon")
Item(*data)
输出如下错误
TypeError: __init__() takes 1 positional argument but 3 were given
有没有办法从元组初始化 BaseModel
?
不可以,Pydantic 模型只能使用关键字参数进行初始化。如果你绝对必须从位置参数初始化它,你可以看看模式:
>>> Item(**dict(zip(Item.schema()["properties"], data)))
Item(name='jhon', surname='dhon')
我写了一个可以从元组加载数据的辅助函数,但是
def fill_model(model: BaseModel, columns: List, row: Tuple) -> BaseModel:
base_model = model()
model_keys = base_model.dict().keys()
fields_count = len(model_keys)
if fields_count != len(columns):
raise ValueError("Columns length doesn't match fields count")
if not set(columns).issubset(model_keys):
raise ValueError("Columns doesn't match model fields")
if fields_count != len(row):
raise ValueError("Data length doesn't match fields count")
return model(**{k: v for k, v in zip(columns, row)})
您还可以使用 pydantics BaseModel parse_obj 函数:Item.parse_obj(some_dict)。 但是,您需要编写包装函数/使用 class.
中的键from pydantic import BaseModel
class Item(BaseModel):
name: str = ""
surname: str = ""
data = ("jhon", "dhon")
fields = Item.__fields__.keys()
zipped_dict = dict(zip(fields, data))
item = Item.parse_obj(zipped_dict)
这样做的好处是,鉴于您的元组始终包含正确的数据,因此在项目 class 中拥有更多条目非常容易处理。
此解决方案将项目 class 的属性与数据元组中的条目压缩在一起。将其转换为字典,可以使用 pydantics parse_obj 函数。