当前位置: 首页 > 知识库问答 >
问题:

如何使用fastAPI、Pydantic和SQLAlchemy正确设置一对多双向关系

柴瀚昂
2023-03-14

我用的是全栈-fastapi-postgresql,fastapi 0 . 54 . 1版,pydantic版。

我不知道如何设置pydantic,因此它可以在SQLAlchemy中正确地使用多对一双向关系。出于某种原因,我当前的实现会以最大递归错误破坏堆栈。

我知道github的一个讨论,来自_orm()应该在加载SQLAlchemy双向关系时检测循环,而不是吹栈。我相信这是密切相关的,但我不能从中获得任何有用的东西。

任何帮助将不胜感激。

来自 fastAPI 的错误消息:

文件“/usr/local/lib/python 3.7/site-packages/fastapi/encoders . py”,第113行,在JSON able _ encoder sqlalchemy _ safe = sqlalchemy _ safe,文件“/usr/local/lib/python 3.7/site-packages/fastapi/encoders . py”,第166行,在JSON able _ encoder sqlalchemy _ safe = sqlalchemy _ safe,文件“/usr/local/lib/python 3.7/site-packages/fastapi/encoders . py”中

模型:

app/模型/公司. py

from typing import TYPE_CHECKING
from sqlalchemy import Boolean, Column, Integer, String
from sqlalchemy.orm import relationship
from app.db.base_class import Base

if TYPE_CHECKING:
    from .company import Company  # noqa: F401

class Company(Base):
    id = Column(Integer, primary_key=True, index=True)
    enabled = Column(Boolean(), default=True)
    logourl = Column(String, index=True)
    name = Column(String, index=True)
    users = relationship("User", back_populates="company")

应用/模型/用户.py

from typing import TYPE_CHECKING

from sqlalchemy import Column, ForeignKey, Integer, String, Boolean, PrimaryKeyConstraint,UniqueConstraint, DateTime    
from sqlalchemy.orm import relationship

from app.db.base_class import Base

if TYPE_CHECKING:
    from .job import Job  # noqa: F401
    from .company import Company  # noqa: F401


class User(Base):
    id = Column(Integer, primary_key=True, index=True)
    full_name = Column(String, index=True)
    email = Column(String, unique=True, index=True, nullable=False)
    hashed_password = Column(String, nullable=False)
    is_active = Column(Boolean(), default=True)
    is_superuser = Column(Boolean(), default=False)
    company_id = Column(Integer, ForeignKey("company.id"))
    company = relationship("Company", back_populates="users")

架构:

app/schemas/user.py

from typing import Optional, Any
from pydantic import BaseModel, EmailStr


# Shared properties
class UserBase(BaseModel):
    email: Optional[EmailStr] = None
    is_active: Optional[bool] = True
    is_superuser: bool = False
    full_name: Optional[str] = None
    company_id: Optional[int] = None
    company: Optional[Any] = None


# Properties to receive via API on creation
class UserCreate(UserBase):
    email: EmailStr
    password: str
    company_id: int

# Properties to receive via API on update
class UserUpdate(UserBase):
    password: Optional[str] = None
    company_id: Optional[int] = None


class UserInDBBase(UserBase):
    id: Optional[int] = None

    class Config:
        orm_mode = True


# Additional properties to return via API
class User(UserInDBBase):
    pass


# Additional properties stored in DB
class UserInDB(UserInDBBase):
    hashed_password: str

app/schemas/company.py

from typing import Optional, List
from pydantic import BaseModel
from .user import User


# Shared properties
class CompanyBase(BaseModel):
    enabled: Optional[bool] = None
    logourl: Optional[str] = None
    name: Optional[str] = None
    users: List[User] = None


# Properties to receive on Company creation
class CompanyCreate(CompanyBase):
    name: str


# Properties to receive on Company update
class CompanyUpdate(CompanyBase):
    pass


# Properties shared by models stored in DB
class CompanyInDBBase(CompanyBase):
    id: int
    name: str

    class Config:
        orm_mode = True


# Properties to return to client
class Company(CompanyInDBBase):
    pass


# Properties properties stored in DB
class CompanyInDB(CompanyInDBBase):
    pass

共有1个答案

壤驷彦
2023-03-14

您正在尝试让user架构包含公司,但也希望公司架构包含user,这意味着当您检索特定公司时,例如,其用户将包含同一公司,而该公司将再次包含所有用户,因此存在递归问题。

当检索到用户company时,您需要决定要显示什么数据,当您只想检索特定的 时,检索公司的完整数据可能没有任何用处。

UserBase架构中删除公司应该就足够了。

 类似资料:
  • 问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • 问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且下面的代码用于保存实体: 在休眠3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时,是我开始获

  • 问题内容: 任何人都可以解释在设计带有示例的表时如何实现一对一,一对多和多对多关系吗? 问题答案: 一对一: 使用外键访问被引用的表: 您还必须在外键列()上设置唯一约束,以防止子表()中的多行与引用表()中的同一行相关。 一对多 :在关系的许多方面使用外键链接回“一个”侧: 多对多 :使用联结表(例如): 查询示例:

  • 问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且以下代码用于保存实体: 在hibernate3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时

  • 在FastAPI中,我使用了SQLAlchemy和Pydanic返回数据 这种方式可以帮助我规范化返回的模型,但是我想要将所有api统一返回格式为{"code":0,"msg":"success","data":{...}},使原本返回模型中User的模型置于data中,方便前端管理。 我尝试了使用FastAPI中间件来实现,但是在swagger等文档中无法识别返回模型User;如果重新定义一个通