我在使用query_factory从QuerySelectField保存数据时遇到问题。我将永远以:
结束错误消息
InterfaceError: (sqlite3.InterfaceError)
Error binding parameter 2 - probably unsupported type.
[SQL: u'INSERT INTO asset_objects (asset_name, asset_type, asset_owner)
VALUES (?, ?, ?)'] [parameters: (u'd', u'Process', <__main__.Model_New_Users
object at 0x03819A50>)]
数据库模型
# --- New Information Assets ---
class Model_New_Asset(db.Model):
__tablename__ = 'asset_objects'
id = db.Column('asset_id', db.Integer, primary_key=True)
asset_name = db.Column(db.String(64), unique=False, index=True)
asset_type = db.Column(db.String(64), unique=False, index=True)
asset_owner = db.Column(db.String(64), unique=False, index=True)
def __init__(self, asset_name, asset_type, asset_owner):
self.asset_name = asset_name
self.asset_type = asset_type
self.asset_owner = asset_owner
表格
class Form_New_Asset(Form):
asset_name = StringField(u'Asset')
asset_type = SelectField(u'Asset type',
choices=[('Process', 'Process'),
('Information', 'Information'),
('Informationssystem', 'Informationssystem'),
('Applikation', 'Applikation')])
# From Model_New_Users
asset_owner = QuerySelectField(u'Owner',
query_factory=lambda: Model_New_Users.query.all(),
get_label='owner_name')
submit = SubmitField('Save')
路线
@app.route('/add_asset', methods=['GET', 'POST'])
def add_asset():
form = Form_New_Asset()
if request.method == 'POST':
if not request.form['asset_name'] or not request.form['asset_type']:
flash(u'Fill out all fields...', 'error')
else:
add_data = Model_New_Asset(asset_name=form.asset_name.data,
asset_type=form.asset_type.data,
asset_owner=form.asset_owner.data)
db.session.add(add_data)
db.session.commit()
flash('Post saved', 'info')
...
我似乎无法从query_factory函数(asset_owner)中检索实际数据?
感谢您的帮助/帮助!
答案 0 :(得分:1)
问题是你提供的Model_New_Users
实例是第二个(0索引)参数。
InterfaceError: (sqlite3.InterfaceError)
Error binding parameter 2 - probably unsupported type.
[SQL: u'INSERT INTO asset_objects (asset_name, asset_type, asset_owner)
VALUES (?, ?, ?)'] [parameters: (u'd', u'Process', <__main__.Model_New_Users object at 0x03819A50>)]
但是在您的模型中,您已将其定义为String
类型:
asset_owner = db.Column(db.String(64), unique=False, index=True)
通过表格中的lambda查询:
asset_owner = QuerySelectField(u'Owner',
query_factory=lambda: Model_New_Users.query.all(),
get_label='owner_name')
然后在您的更新中传递整个对象。我认为这是错误。
add_data = Model_New_Asset(asset_name=form.asset_name.data,
asset_type=form.asset_type.data,
asset_owner=form.asset_owner.data)
我认为您可以通过指定要传递的Model_New_Users
上的哪个字段来修复它。像form.asset_owner.data.owner_name
或其他什么。
答案 1 :(得分:1)
您获得实例的原因是因为您没有提供
def __str__():
表示。希望这个帮助的新手像我一样。