SQLAlchemy 多对多理解
SQLAlchemy Many to Many Understanding
我只是无法理解 (Flask-)SQLAlchemy 中的多对多关系或反向引用似乎如何适用于我的问题。
这是我想要实现的目标:
- n 用户 每个人都有 n 个(预定义)任务 要做
- 每个用户可以多次提交他们的作品(提交 - 属于 8 个 作业 之一)。
快速示例:虚拟用户有 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 了解这里的一些东西:
relationship 'Assignment.submissions' will copy column assignments.id to column submissions.assignment_id, which conflicts with relationship(s): 'Assignment.users' (copies assignments.id to submissions.assignment_id), 'User.assignments' (copies assignments.id to submissions.assignment_id).
relationship 'Submission.user' will copy column users.id to column submissions.user_id, which conflicts with relationship(s): 'Assignment.users' (copies users.id to submissions.user_id), 'User.assignments' (copies users.id to submissions.user_id)
等
预先感谢您的帮助!
请阅读 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 可能有用。
我只是无法理解 (Flask-)SQLAlchemy 中的多对多关系或反向引用似乎如何适用于我的问题。
这是我想要实现的目标:
- n 用户 每个人都有 n 个(预定义)任务 要做
- 每个用户可以多次提交他们的作品(提交 - 属于 8 个 作业 之一)。
快速示例:虚拟用户有 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 了解这里的一些东西:
relationship 'Assignment.submissions' will copy column assignments.id to column submissions.assignment_id, which conflicts with relationship(s): 'Assignment.users' (copies assignments.id to submissions.assignment_id), 'User.assignments' (copies assignments.id to submissions.assignment_id).
relationship 'Submission.user' will copy column users.id to column submissions.user_id, which conflicts with relationship(s): 'Assignment.users' (copies users.id to submissions.user_id), 'User.assignments' (copies users.id to submissions.user_id)
等
预先感谢您的帮助!
请阅读 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 可能有用。