【问题标题】:override field alias from subclass in Pydantic覆盖 Pydantic 中子类的字段别名
【发布时间】:2023-03-15 12:29:01
【问题描述】:

我有 2 个模型,1 个子类化另一个:

from pydantic import BaseModel
from typing import List

class Model1(BaseModel):
    names: List[str]

class Model2(Model1):
    # define here an alias for names -> e.g. "firstnames"
    pass

data = { "names": ["rodrigo", "julien", "matthew", "bob"] }
# Model1(**data).dict()  -> gives {'names': ['rodrigo', 'julien', 'matthew', 'bob']}
# Model2(**data).dict()  -> gives {'firstnames':  ['rodrigo', 'julien', 'matthew', 'bob']}

我怎样才能做到这一点?

【问题讨论】:

    标签: python pydantic


    【解决方案1】:

    你不需要子类来完成你想要的(除非你的需要比你的例子更复杂)。

    对于导入:Config 选项添加到allow_population_by_field_name,以便您可以使用namesfirstnames 添加数据

    对于导出:dict()方法中添加by_alias=True来控制输出

    from pydantic import BaseModel
    from typing import List
    
    
    class Model(BaseModel):
        names: List[str] = Field(alias="firstnames")
    
        class Config:
            allow_population_by_field_name = True
    
    
    def main():
        data = {"names": ["rodrigo", "julien", "matthew", "bob"]}
        model = Model(**data)
        print(model.dict())
        print(model.dict(by_alias=True))
    
    
    if __name__ == '__main__':
        main()
    

    产量:

    {'names': ['rodrigo', 'julien', 'matthew', 'bob']}
    {'firstnames': ['rodrigo', 'julien', 'matthew', 'bob']}
    

    【讨论】:

    • 这正是我最终所做的。很高兴看到我确实分享了与您描述的相同的路径。虽然我实际上需要更多逻辑,但无论如何我还是对模型进行了子类化。在子类中添加 fields = {"names":"firstnames"} 以便在 by_alias=True 时转换为“名字”,仅当它针对此子模型而不是父实例化时。您对此有何看法?
    • 听起来,对于您的域来说,这很有意义,而且是一个很好的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2016-10-11
    • 2015-11-05
    • 2014-04-14
    • 2021-06-30
    相关资源
    最近更新 更多