繁体   English   中英

SQLAlchemy 多对多理解

[英]SQLAlchemy Many to Many Understanding

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

这是我想要实现的目标:

  • n 个用户每人有 n 个(预定义)任务要做
  • 每个用户可以多次提交他们的工作(提交- 属于 8 个作业之一)。

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

所以到目前为止,我在 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"),
    )


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

  • 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文档下的警告部分,其中描述了您正在建立单独关系(直接到/来自关联表和辅助表)的情况。

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

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

关联代理也可能有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM