假设我有以下 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 达到相同的结果?
您还需要为
id
提供 ProfileSerializer
。 Pydantic 的工作原理取决于您定义模式的方式。目前 ProfileSerializer
的架构与 user
对象本身不匹配。
这会起作用:
user = User(10, "foo", "bar")
print(ProfileSerializer.model_validate({"id": user.id, "private_data": user}))