Pydantic模型之间的双向关系



假设一个用户有多个帖子,而一个帖子只有一个用户。我想知道是否有一种方法来指定双向关系(如果它是可取的)?当尝试执行以下操作时,结果为"NameError: name 'Post' is not defined"

from typing import List
from pydantic import BaseModel
class User(BaseModel):
id: int
posts: List[Post]

class Post(BaseModel):
id: int
user: User

Pydantic新手,任何帮助都将非常感激!

您可以通过延迟注释来实现这一点:

from typing import List
from pydantic import BaseModel

class User(BaseModel):
id: int
posts: "List[Post]"

class Post(BaseModel):
id: int
user: User

User.update_forward_refs()

来自同一来源的另一种方法:

from __future__ import annotations
from typing import List
from pydantic import BaseModel
class User(BaseModel):
id: int
posts: List[Post]

class Post(BaseModel):
id: int
user: User
user = User(id=1, posts=[])
post = Post(id=1, user=user)

注:但这看起来是错误的设计。最好选择一个方向。

你最可能在寻找什么(2023)

所以你写它的方式,即使你得到了正确的注释,最终也会导致循环引用验证错误。

如果你考虑的更像是关系数据库的双向关系,假设你的模型有一个id字段,你想要一个类似外键的东西。

在这种情况下,只需添加一个<your_model_name>_id字段。

这可能有点乏味,但最好让您的模型关系以一种方式运行。

的例子:

from pydantic import BaseModel
class User(BaseModel):
id: int
posts: List[Post]

class Post(BaseModel):
id: int
user_id: str  # <- or int, depending on how you want it setup. I'd recommend string though.
user = User(id=1, posts=[])
post = Post(id=1, user_id=1)
user.posts.append(post)

根据我的经验,这是目前处理这种情况最合适的方法,而且我是反向关系的狂热粉丝哈哈。

最新更新