簡體   English   中英

SQLAlchemy多對多關聯類

[英]SQLAlchemy many-to-many association class

我有以下兩個類(簡化):

class User(db.Model):
    __tablename__ = "AppUser"
    user_id = db.Column(db.Integer, primary_key=True)

class Task(db.Model):
    __tablename__ = "Task"
    task_id = db.Column(db.Integer, primary_key=True)

我想通過多對多關聯將它們加入其中,但是除了主鍵之外還存儲了另外一列:

class Solved(db.Model):
    __tablename__ = "Solved"
    user_id = db.Column(db.Integer, db.ForeignKey("AppUser.user_id"), primary_key=True)
    task_id = db.Column(db.Integer, db.ForeignKey("Task.task_id"), primary_key=True)
    solved_at = db.Column(db.DateTime, default=datetime.utcnow)

我選擇了表上的類,因為如果必須存儲其他列,SQLAlchemy文檔建議使用一個類。

我的問題是我無法“加入”他們。 我嘗試了以下方法:

將引用直接添加到關聯表:

task = db.relationship("Task", backref="users")
user = db.relationship("AppUser", backref="tasks")

添加對User和task類的引用:

class User:
    [...]
    tasks = db.relationship("Solved", backref="users")

class Task:
    [...]
    users = db.relationship("Solved", backref="tasks")

他們都不工作。 令我驚訝的是,如果我將Solved類更改為db.Table對象,它會起作用。 我想嘗試關聯類,因為我使用的子查詢引用了Solved但不接受db.Table對象。

我要做的是將“已解決”任務添加到列表中:

u = User.query.get([...])
t = Task.query.get([...])
u.tasks.append(t)
db.session.add(u)
db.session.commit()

編輯:

當我檢查某個元素是否已經“已解決”時:

# My models have name fields
u.tasks.filter_by(name="abc")

我收到以下錯誤:

AttributeError: '_AssociationList' object has no attribute 'filter_by'

當我將新元素添加到列表中時:

u.tasks.append(t)
db.session.add(u) # These two steps work
db.session.commit() # Error

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: relationship 'user' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)   

如上所述,它與簡單的db.Table關聯一起工作,但不適用於關聯類。

我也嘗試過像這里這樣的關聯代理(SQLAlchemy docs),但是遇到了與上面相同的錯誤。

我能夠解決問題。 我主要復制了官方文檔中關聯代理教程。以下是一些其他人的陷阱和技巧:

  • 在您要加入的課程之后寫您的協會課程。 (對於我們大多數人來說都是顯而易見的,但檢查不會有傷害)
  • 在您的關聯類中添加__init__函數!
  • 仔細檢查您的backrefs,類和表名。 我自己沒有仔細檢查何時使用哪個關鍵字,但是大多數情況下都會出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM