2012-08-03 88 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