8

私はFlask-SQLAlchemyチュートリアルに従っています。Python2.6にFlask0.9、sqlalchemy 0.7.8、flask-sqlalchemy0.16があります。(そして私はEclipseで作業します)

(チュートリアルはここにあります: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

どのチュートリアルを信頼する必要がありますか?

どうもありがとうございます !

4

1 に答える 1

13

なぜこのようなエラーが発生するのか理解できません。マップされたオブジェクトを追加する正しい方法は何ですか?

ウォレットの関係を構成するときは、lazy="dynamic"オプションを使用することに注意してください。このようにして、動的な関係を設定します。大規模なコレクションで使用するように設計されているため、1対1の関係で使用することはあまり意味がありません。

同時に、スカラー関係に割り当てる方法が変わります。つまり、単一のオブジェクトを直接評価することはできません。

self.wallet = wallet

ただし、反復可能を使用する必要があります

self.wallet = [wallet]

したがって、ここには2つの解決策があります。上記のように1つの要素のコレクションを割り当てるか、この関係に動的コレクションの使用を停止することをお勧めします。

于 2012-08-05T13:35:57.607 に答える