我正在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数据库浏览器中提取了数据库,它向我显示了同样的事情。我设置错误了什么?
答案 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提供所需的外键。