python - SQLAlchemy 多对多理解
问题描述
我只是无法理解(Flask-)SQLAlchemy 中的多对多关系或反向引用似乎如何适用于我的问题。
这是我想要实现的目标:
- n 个用户每人有 n 个(预定义)任务要做
- 每个用户可以多次提交他们的工作(提交- 属于 8 个作业之一)。
快速示例:虚拟用户有 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"),
)
我得到的是这些警告,所以我认为我在这里遗漏/不理解某些东西:
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)
等等
在此先感谢您的帮助!
解决方案
请阅读关联对象文档下的警告部分,其中描述了您正在建立单独关系(直接到/来自关联表和辅助表)的情况。
根据您的模型,我假设多对多将是只读的,因为无论如何它都不允许您访问“提交”上的属性,我会将其标记为:
class User(db.Model):
__tablename__ = "users"
...
assignments = db.relationship(
"Assignment",
secondary="submissions",
backref=db.backref("users", lazy=True, viewonly=True),
viewonly=True,
)
关联代理也可能有用。
推荐阅读
- android-studio - ContextCompat()' 在 'android.support.v4.content.ContextCompat' 中具有受保护的访问权限
- java - Java - 如何在 HTML 无序列表中添加点字符
- sas - 如何用proc制表衡量百分比?
- java - “从命令行运行 Maven 时无法执行目标 org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M1:test (default-test)”
- c# - 有时更新进度在asp.net c#中不起作用
- clang - Clang-format -output-replacements-xml 文档
- node.js - CastError:模型“Page”的路径“_id”处值“5be86bf8170c2c22f8bb93a6”的值“5be86bf8170c2c22f8bb93a6”转换为 ObjectId 失败
- python - 向异步 Celery 任务添加回调
- sorting - 如何在不使用度量的情况下在 Power BI 中按矩阵中的列排序
- gitlab - 没有 Docker 的 Gitlab-runner