Flask-SQLAlchemy db.commit()更改字段的值

时间:2013-09-23 17:27:47

标签: python sqlalchemy flask flask-sqlalchemy

我正在Flask中构建一个简单的应用程序,并且在使用Flask-SQLAlchemy时难以使数据库正常运行。这是我的models.py:

from spot import plate
from spot import db
import flask.ext.whooshalchemy as whooshalchemy

class Country(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    country_name = db.Column(db.String(64), unique = True)
    codes = db.relationship('Code', backref='country', lazy='dynamic')

    def __repr__(self):
        return '<%r>' % (self.country_name)

class Code(db.Model):
    __searchable__ = ['scramble']

    id = db.Column(db.Integer, primary_key = True)
    scramble = db.Column(db.String(64), db.ForeignKey('country.id'))

    def __repr__(self):
        return '<%r>' % (self.scramble)

whooshalchemy.whoosh_index(plate, Code)

我正在尝试创建一些测试数据以查看关系是否按预期工作,但出于某种原因,当我创建新代码并将其提交到数据库时,某些东西会覆盖我的争夺值字段为“1”,如下:

>>> from spot.models import Country, Code 
>>> from spot import db
>>> c = Country(country_name="Testingstan")
>>> cd = Code(scramble="TS", country=c)
>>> cd.scramble
'TS'
>>> db.session.add(c)
>>> c.country_name
'Testingstan'
>>> db.session.add(cd)
>>> cd.scramble
'TS'
>>> db.session.commit()
>>> c.country_name
u'Testingstan'
>>> cd.scramble
u'1'
>>> for code in c.codes:
...     print code
...
<u'1'>

所以我确信国家和代码之间的联系正确,但为什么SQLAlchemy会覆盖我的争夺而不是我的国家名称?我在sqlite数据库浏览器中提取了数据库,它向我显示了同样的事情。我设置错误了什么?

1 个答案:

答案 0 :(得分:3)

Code模型中,您将scramble字段定义为与Country的关系的外键。这使得SQLAlchemy获得该字段的所有权并使用它来存储相关国家/地区的ID。

我认为你想要的是这个:

class Code(db.Model):
    __searchable__ = ['scramble']

    id = db.Column(db.Integer, primary_key = True)
    scramble = db.Column(db.String(64))
    country_id = db.Column(db.Integer, db.ForeignKey('country.id'))

    def __repr__(self):
        return '<%r>' % (self.scramble)

通过这种方式,您可以获得scramble字段,但您也可以为SQLAlchemy提供所需的外键。