【问题标题】:FastAPI many to many Response Schema and RelationshipFastAPI 多对多响应模式和关系
【发布时间】:2021-10-08 02:55:51
【问题描述】:

我是 FastAPI 和 SQL-Alchemy 的新手,在创建多对多表(关联表)的架构和关系时遇到问题。

这里是一个例子,一个学生可以注册多个课程,一个课程可以有多个学生,从而形成多对多的关系。

数据库模型

class Student(Base):
    __tablename__ = "student"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, nullable=False)


class Course(Base):
    __tablename__ = "course"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, nullable=False)


class StudentCourse(Base):
    __tablename__ = "student_course"

    id = Column(Integer, primary_key=True, index=True)
    student_id = Column(Integer, ForeignKey("student.id"), nullable=False)
    course_id = Column(Integer, ForeignKey("course.id"), nullable=False)

我需要定义什么关系以及如何设计一个架构,我可以从中得到以下响应:

响应 1

[
  {
    "id": 1,
    "name": "Student A",
    "courses": [
      {
        "id": 1,
        "name": "Course A"
      },
      {
        "id": 2,
        "name": "Course B"
      }
    ]
  },
  {
    "id": 2,
    "name": "Student B",
    "courses": [
      {
        "id": 1,
        "name": "Course A"
      },
      {
        "id": 3,
        "name": "Course C"
      }
    ]
  },
  {...}
]

响应 2

[
  {
    "id": 1,
    "name": "Course A",
    "students": [
      {
        "id": 1,
        "name": "Student A"
      },
      {
        "id": 2,
        "name": "Student B"
      }
    ]
  },
  {
    "id": 2,
    "name": "Course B",
    "students": [
      {
        "id": 1,
        "name": "Student A"
      },
    ]
  },
  {
    "id": 3,
    "name": "Course C",
    "students": [
      {
        "id": 2,
        "name": "Student B"
      },
    ]
  },
  {...}
]

【问题讨论】:

    标签: sqlalchemy fastapi pydantic


    【解决方案1】:

    在我看来,对于这种多对多关系,使用关联表而不是关联对象更简单且更可取,因为您不需要额外的字段。 所以,根据documentation,你的数据库模型应该是:

    student_course = Table("student_course", Base.metadata,
                           Column("student_id", ForeignKey("student.id"), primary_key=True),
                           Column("course_id", ForeignKey("course.id"), primary_key=True))
    
    class Student(Base):
        __tablename__ = "student"
    
        id = Column(Integer, primary_key=True)
        name = Column(String, nullable=False)
        courses = relationship("Course",
                               secondary=student_course,
                               back_populates="students")
    
    
    class Course(Base):
        __tablename__ = "course"
    
        id = Column(Integer, primary_key=True)
        name = Column(String, nullable=False)
        students = relationship("Student",
                                secondary=student_course,
                                back_populates="courses")
    

    和你的 pydantic 模型(模式):

    class Student(BaseModel):
        id: int
        name: str
    
        class Config:
            orm_mode = True
    
    
    class Course(BaseModel):
        id: int
        name: str
    
        class Config:
            orm_mode = True
    
    
    class StudentOut(Student):
        courses: List[Course]
    
    
    class CourseOut(Course):
        students: List[Student]
    

    StudentOutCourseOut 是您的响应模型

    【讨论】:

    • 我会检查并尽快回复您:)
    猜你喜欢
    • 2023-02-02
    • 2021-08-30
    • 2021-11-01
    • 2014-02-02
    • 2022-01-25
    • 2019-01-28
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多