我正在关注Flask-SQLAlchemy教程。我在python 2.6上有Flask 0.9,sqlalchemy 0.7.8和flask-sqlalchemy 0.16。 (我和eclipse一起工作)
(tuto在这里:http://packages.python.org/Flask-SQLAlchemy/models.html)
我有两个班:男人和钱包。有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
在我的“main”模块中,我创建了我的数据库:
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
我应该信任哪个教程?
非常感谢!
答案 0 :(得分:12)
我无法理解为什么会出现这样的错误。添加映射对象的正确方法是什么?
请注意,在配置钱包关系时,请使用lazy =“dynamic”选项。这样您就可以设置dynamic relationship。由于它被设计为与大型集合一起使用,因此将它与一对一关系一起使用并没有多大意义。
同时它改变了你可以分配给标量关系的方式,即你无法直接分配单个对象:
self.wallet = wallet
但你必须使用可迭代的
self.wallet = [wallet]
所以你在这里有两个解决方案:如上所示分配一个元素的集合,或者更好地停止使用动态集合来实现这种关系。