2015-07-19 105 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,类和表名。 我自己没有看过什么时候使用哪个关键字,但大部分时间都有你的错误。