如何在子类中使用pydantic模型以及python中的graphenepydantic和graphene?

2024-09-24 22:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

用例场景

我有两个pydantic模型。每个人都在自己的模块(文件)中。一种型号,即TUser取决于TAddress

地址_model.py

class TAddress(BaseModel):
    id: Optional[int]
    address: Optional[constr(max_length=100, strip_whitespace=True)]
    city: Optional[constr(max_length=80, strip_whitespace=True)]
    postal_code: Optional[constr(max_length=15, strip_whitespace=True)]
    country: Optional[constr(max_length=3)]

user_model.py

class TUser(BaseModel):
    id: UUID = None
    email: Optional[EmailStr]

    address: Optional[TAddress]

    is_active: Optional[bool]
    is_email_verified: Optional[bool]
    created_at: Optional[datetime.datetime]

如果我将TUser模型用于PydanticObjectType

class UserType(PydanticObjectType):
    class Meta:
        model = TUser

我收到以下错误消息:

graphene_pydantic.converters.ConversionError: Don't know how to convert the Pydantic field ModelField(name='address', type=Optional[TAddress], required=False, default=None) (<class 'app.address.serializers.TAddress'>)

在使用不同模块的pydantic模型时,似乎存在一个相互依赖的问题。 这个用例的解决方案是什么

有什么想法吗


Tags: 模型truemodeladdress用例lengthoptionalmax
1条回答
网友
1楼 · 发布于 2024-09-24 22:25:27

错误消息为您提供了所需的提示

Don't know how to convert the Pydantic field ModelField(name='address'....

发生的事情是Graphene不知道如何转换address类,以便能够将其与TUser一起使用,因为它是PydanticObject的一部分

为了消除错误,需要定义一个PydanticObjectType引用TAddress,这样石墨烯就会知道这两个对象之间的关系

在具有UserType的模式文件中,只需执行以下操作:

class AddressType(PydanticObjectType):
    class Meta:
        model = TAddress

class UserType(PydanticObjectType):
    class Meta:
        model = TUser

相关问题 更多 >