SQLAlchemy 多对多理解

SQLAlchemy Many to Many Understanding

我只是无法理解 (Flask-)SQLAlchemy 中的多对多关系或反向引用似乎如何适用于我的问题。

这是我想要实现的目标:

快速示例:虚拟用户有 2 个作业(例如编写一个 For 循环),he/she 为第一个作业提交了 2 个代码片段(每个都单独评分),none 还没有为第二个作业提交。

所以这是我到目前为止在 SQLAlchemy 中的 Class 定义:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    assignments = db.relationship(
        "Assignment", secondary="submissions", backref=db.backref("users", lazy=True)
    )


class Assignment(db.Model):
    __tablename__ = "assignments"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(40), nullable=False)



class Submission(db.Model):
    __tablename__ = "submissions"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    assignment_id = db.Column(db.Integer, db.ForeignKey("assignments.id"))
    user = db.relationship(User, backref=db.backref("submissions"))
    assignment = db.relationship(
        Assignment,
        backref=db.backref("submissions"),
    )


我得到的是这些警告,所以我想我 missing/not 了解这里的一些东西:

预先感谢您的帮助!

请阅读 Association Object 文档下的警告部分,其中描述了您建立独立关系的情况(直接 to/from 关联 table 和次要关系)。

根据您的模型,我假设多对多是只读的,因为无论如何它都不允许您访问“提交”上的属性,我会这样标记它:

class User(db.Model):
    __tablename__ = "users"
    ...
    assignments = db.relationship(
        "Assignment",
        secondary="submissions",
        backref=db.backref("users", lazy=True, viewonly=True),
        viewonly=True,
    )

另外 Association Proxy 可能有用。