2016-12-30 6 views
0

У меня проблема с сохранением данных из QuerySelectField с помощью query_factory. Я всегда закончится:Получить значения данных из QuerySelectField с помощью query_factory

Сообщение об ошибке

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>)] 

DB Модель

# --- 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') 

Route

@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

Проблема в том, что вы предоставляете экземпляр 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) 

Это запрошены через лямбда в вашей форме:

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 или что-то еще.

0

Причина вы получаете экземпляр обратно, потому что вы не дали

def __str__():

представлении. Надеюсь, новички этой помощи, как я.