2012-08-03 46 views
2

我遵循Flask-SQLAlchemy教程。我在python 2.6上有Flask 0.9,sqlalchemy 0.7.8和flask-sqlalchemy 0.16。 (和我一起工作的Eclipse)Flask SqlAlchemy:TypeError:'Class'对象不可迭代

(该政党成员是在这里:http://packages.python.org/Flask-SQLAlchemy/models.html

我有2类:一个男人和一个钱包。有一个1-1的关系。 (每个人都有他自己的钱包)

class Man(db.Model): 
    sid = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(100), unique=False) 
    wallet = db.relationship('Wallet', backref='man', lazy='dynamic', uselist=False) 

    def __init__(self, wallet): 
     self.wallet = wallet 

class Wallet(db.Model): 
    sid = db.Column(db.Integer, primary_key=True) 
    account = db.Column(db.Integer) 
    manId = db.Column(db.Integer, db.ForeignKey('man.sid')) 

    def __init__(self, account): 
     self.account = account 

在我的“主”模块,创建我的数据库:

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:PATH' 
db = SQLAlchemy(app) 

在这同一个模块,我尝试将钱包附加到一个人:

if __name__ == "__main__": 
    db.create_all() 
    w1 = Wallet(132) 
    w2 = Wallet(18) 
    db.session.add(w1) 
    db.session.add(w2) 
    db.session.commit() 
    man1 = Man(w1) 
    db.session.add(man1) 
    db.session.commit() 

但我得到这个错误:

TypeError: 'Wallet' object is not iterable 

我不明白为什么会出现这样的错误。添加映射对象的正确方法是什么?

PS:我一直在SQLAlchemy的教程,我相信他们会以不同申报物品:

class Man(db.Model): 
    sid = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(100), unique=False) 
    wallet = db.relationship('Wallet', backref='man', lazy='dynamic', uselist=False) 
    manId = db.Column(db.Integer, db.ForeignKey('man.sid')) 
    def __init__(self, wallet): 
     self.wallet = wallet 

class Wallet(db.Model): 
    sid = db.Column(db.Integer, primary_key=True) 
    account = db.Column(db.Integer) 

    def __init__(self, account): 
     self.account = account 

哪个教程中,我应该相信?

非常感谢!

回答

11

I fail to understand why such an error appears. What is the right way of adding a mapped object ?

请注意,当您使用lazy =“dynamic”选项配置您的钱包关系时。这样你就建立了一个dynamic relationship。由于它被设计为与大型集合一起使用,因此将它与一对一关系一起使用并不太合理。

在它改变,你可以分配给您的标量关系的方式的同时,即你不能直接assing您的单个对象:

self.wallet = wallet 

,但你必须这样使用迭代

self.wallet = [wallet] 

你在这里有两个解决方案:或者如上所示分配一个元素的集合,或者更好地停止对这个关系使用动态集合。

+0

这基本上是正确的答案。使用“uselist = False”和“lazy ='dynamic'”是无意义的,我认为这里的'dynamic'标志将胜过“uselist”。真的不应该被允许,会看看我能否补充一点。 – zzzeek 2012-08-06 02:37:33

+0

我已经在http://docs.sqlalchemy.org/en/rel_0_7/orm/collections.html#dynamic-relationship-loaders上更新了文档,0.7.9中还有一个警告,0.8中有异常提升。 – zzzeek 2012-08-06 03:06:26