2015-07-19 170 views
0

我有以下兩類(簡體):SQLAlchemy的許多一對多關聯類

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) 

我想有許多-to-many關聯加入他們的行列,但存儲的附加列除了主鍵:

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

添加引用到用戶和任務等級:

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協會的工作,但不能與一個關聯類。

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

+0

*什麼*確切地不起作用?代碼在你定義關係時失敗?或者一些具體的查詢?你能提供你所嘗試的代碼嗎? – van

回答

0

我能解決問題。 我大多複製association proxy tutorial from the official doc 這裏是誰的鬥爭其他人一些陷阱和技巧:

  • 寫您的關聯類你想加入的類後。 (對我們大多數人來說顯而易見,但它不會影響檢查)
  • __init__函數添加到您的關聯類中!
  • 仔細檢查你的backrefs,類和表名。 我自己沒有看過什麼時候使用哪個關鍵字,但大部分時間都有你的錯誤。
相關問題