【问题标题】:Flask SqlAlchemy : TypeError: 'Class' object is not iterableFlask SqlAlchemy:TypeError:'Class'对象不可迭代
【发布时间】:2012-08-01 13:46:11
【问题描述】:

我正在关注 Flask-SQLAlchemy 教程。我在 python 2.6 上有 Flask 0.9、sqlalchemy 0.7.8 和 flask-sqlalchemy 0.16。 (我使用 Eclipse)

(教程在这里: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

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

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

我应该相信哪个教程?

非常感谢!

【问题讨论】:

    标签: object sqlalchemy relationship python-2.6 flask-sqlalchemy


    【解决方案1】:

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

    请注意,当您配置您的钱包关系时,您使用了lazy="dynamic" 选项。这样您就可以设置dynamic relationship。由于它被设计为与大型集合一起使用,因此将它与一对一的关系一起使用并没有多大意义。

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

    self.wallet = wallet
    

    但你必须使用可迭代的

    self.wallet = [wallet]
    

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

    【讨论】:

    • 这基本上是正确的答案。将“uselist=False”与“lazy='dynamic'”一起使用是荒谬的,我认为这里的“dynamic”标志将胜过“uselist”。真的根本不应该被允许,看看我是否可以添加。
    • 我已经在docs.sqlalchemy.org/en/rel_0_7/orm/… 更新了文档,并且在 0.7.9 中还有一个警告,在 0.8 中出现了异常。
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 2021-12-25
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多