我遵循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
哪个教程中,我应该相信?
非常感谢!
这基本上是正确的答案。使用“uselist = False”和“lazy ='dynamic'”是无意义的,我认为这里的'dynamic'标志将胜过“uselist”。真的不应该被允许,会看看我能否补充一点。 – zzzeek 2012-08-06 02:37:33
我已经在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