2013-09-23 113 views
0

我建立在燒瓶內的簡單的應用程序,並具有與製作數據庫舉止得體,而使用燒瓶SQLAlchemy的難度值。這裏是我的models.py:燒瓶SQLAlchemy的db.commit()改變字段

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數據庫瀏覽器中拉起了數據庫,它向我展示了同樣的東西。我有什麼不正確的設置?

回答

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的需要外鍵。

+0

這就是它 - 我的愚蠢的錯誤。謝謝! –