Pydantic模型之间的双向关系

3
假设一个用户有多篇文章,而一篇文章只能属于一个用户。我想知道是否有一种方式可以指定双向关系(如果这是可取的话)? 当尝试以下操作时,会出现“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,希望您能给予帮助!

3个回答

4
你可以通过延迟注释的方式来实现这一点:
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()

1

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

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)

P.S. 但是它看起来是错误的设计。最好选择一个方向。


-1

你最有可能真正寻找的是什么(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)

根据我的经验,这是目前处理这个问题的最合适方式,而且我是一个热衷于反向关系的粉丝,哈哈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接