pydantic 从模型中排除多个字段

muo*_*uon 16 python model backend pydantic fastapi

在 pydantic 中,有一种更干净的方法可以从模型中排除多个字段,例如:


class User(UserBase):
    class Config:        
        exclude = ['user_id', 'some_other_field']

Run Code Online (Sandbox Code Playgroud)

我知道以下有效。


class User(UserBase):

    class Config:       
        fields = {'user_id': {'exclude':True}, 
                   'some_other_field': {'exclude':True}
                 }
Run Code Online (Sandbox Code Playgroud)

但我一直在寻找像 django Rest Framework 这样更干净的东西,你可以在其中指定排除或包含的列表。

小智 12

Pydantic 将排除以下划线开头的类变量。因此,如果它适合您的用例,您可以重命名您的属性。

class User(UserBase):
    _user_id=str
    some_other_field=str
    ....
Run Code Online (Sandbox Code Playgroud)


Gal*_*ses 9

要排除字段,您还可以exclude使用Field

from pydantic import BaseModel, Field

class Mdl(BaseModel):
    val: str = Field(
        exclude=True,
        title="val"
    )
Run Code Online (Sandbox Code Playgroud)

但是,在类中添加排除参数的优点Config似乎是您可以使用以下命令获取排除参数的列表

print(Mdl.Config.exclude)
Run Code Online (Sandbox Code Playgroud)


mil*_*ani 7

我为我的 json 写了这样的东西:

from pydantic import BaseModel


class CustomBase(BaseModel):
    def json(self, **kwargs):
        include = getattr(self.Config, "include", set())
        if len(include) == 0:
            include = None
        exclude = getattr(self.Config, "exclude", set())
        if len(exclude) == 0:
            exclude = None
        return super().json(include=include, exclude=exclude, **kwargs)

    

class User(CustomBase):
    name :str = ...
    family :str = ...

    class Config:
        exclude = {"family"}


u = User(**{"name":"milad","family":"vayani"})

print(u.json())
Run Code Online (Sandbox Code Playgroud)

你可以重写 dict 和其他方法。