在 Pydantic V2 中使用 model_validate() 将字段传递给嵌套模型

问题描述 投票:0回答:1

假设我有以下 SQLAlchemy DB 模型:

class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(sa.Integer(), primary_key=True)
    username: Mapped[str | None] = mapped_column(sa.String(64), nullable=True, index=True)
    email: Mapped[str | None] = mapped_column(sa.String(128), nullable=True)

我使用以下 Pydantic V2 模型来序列化用户对象:

class PrivateDataSerializer(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    username: str | None
    email: str | None


class ProfileSerializer(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    private_data: PrivateDataSerializer

如您所见,我将

username
email
字段放入嵌套模型中。

我的目标是能够使用以下方法将用户对象加载到 Pydantic 模型中:

ProfileSerializer.model_validate(user)

但是,我找不到正确配置

private_data
中字段映射的方法。

我对 Django DRF 有一些经验,并且使用它

ModelSerializer
您可以为此目的为嵌套模型指定
source="*"

class PrivateDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ["username", "email"]


class ProfileSerializer(serializers.ModelSerializer):
    private_data = PrivateDataSerializer(source="*")

    class Meta:
        model = User
        fields = ["id", "private_data"]

那么,如何使用 Pydantic 达到相同的结果?

python python-3.x pydantic-v2
1个回答
0
投票

您还需要为

id
提供
ProfileSerializer
。 Pydantic 的工作原理取决于您定义模式的方式。目前
ProfileSerializer
的架构与
user
对象本身不匹配。

这会起作用:

user = User(10, "foo", "bar")
print(ProfileSerializer.model_validate({"id": user.id, "private_data": user}))
© www.soinside.com 2019 - 2024. All rights reserved.