首页 > 解决方案 > SQLAlchemy 多对多理解

问题描述

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

这是我想要实现的目标:

快速示例:虚拟用户有 2 个作业(例如,为 For 循环编程),他/她为第一个作业提交了 2 个代码片段(每个单独评分),而第二个作业尚未提交。

所以这是我到目前为止在 SQLAlchemy 中的类定义方面得到的:

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"),
    )


我得到的是这些警告,所以我认为我在这里遗漏/不理解某些东西:

在此先感谢您的帮助!

标签: pythondatabasesqlalchemy

解决方案


请阅读关联对象文档下的警告部分,其中描述了您正在建立单独关系(直接到/来自关联表和辅助表)的情况。

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

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

关联代理也可能有用。


推荐阅读