按调用更改pydantic的'extra='行为

0 投票
1 回答
30 浏览
提问于 2025-04-14 15:25

我想定义一个pydantic的BaseModel,并设置extra='forbid',这样在某些特定的地方可以验证那些我知道会有额外字段的对象,同时在没有指定的情况下仍然禁止额外字段,这样可以吗?

如果不行,那有什么简洁或者普遍推荐的方法呢?是用中间类?在模型上定义类方法?类型适配器?还是实用的转换函数?

我对这些都感兴趣,虽然我具体的情况是处理pydantic和sqlmodel对象在数据库中进出,以及有和没有相关模型的情况。

我希望能有类似这样的东西:

class NoExtras(BaseModel)
    model_config = Dict(
        extra='forbid',
    )
    name:str

somedict = dict(name='aname', extra_field='astring')

validated = NoExtras.model_validate(somedict, allow_extra=True)

1 个回答

0

从pydantic版本2.6.4开始,你不能在每次调用时单独修改extra的行为。不过,你可以简单地从输入中去掉多余的字段,这样就能达到类似的效果:

validated = NoExtras.model_validate({key:value for key,value in somedict.items() if key in NoExtras.model_fields})

需要注意的是,这种方法只适用于简单的模型。

撰写回答