假设一个用户有多个帖子,而一个帖子只有一个用户。我想知道是否有一种方法来指定双向关系(如果它是可取的)?当尝试执行以下操作时,结果为"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)
根据我的经验,这是目前处理这种情况最合适的方法,而且我是反向关系的狂热粉丝哈哈。