2016-12-30 2 views
0

Ich habe Probleme, Daten von QuerySelectField mit query_factory zu speichern. Ich werde immer am Ende mit:Erhalte Datenwerte von QuerySelectField mit query_factory

Fehlermeldung

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 Modell

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

Formular

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

Strecke

@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') 
... 

Es scheint, dass ich nicht die tatsächlichen Daten aus der query_factory Funktion (asset_owner) abrufen kann?

Schätzen Sie Ihre Hilfe/Hilfe!

Antwort

0

Das Problem besteht darin, dass Sie eine Instanz von Model_New_Users als 2. (0-indizierten) Parameter bereitstellen.

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

Aber in Ihrem Modell haben Sie es als String Typen definiert:

asset_owner = db.Column(db.String(64), unique=False, index=True) 

Dies wird über eine Lambda in Ihrem Formular abgefragt:

asset_owner = QuerySelectField(u'Owner', 
           query_factory=lambda: Model_New_Users.query.all(), 
           get_label='owner_name') 

Und dann die gesamte Objekt ist in Ihrem Update übergeben. Ich denke, das ist der Fehler.

 add_data = Model_New_Asset(asset_name=form.asset_name.data, 
            asset_type=form.asset_type.data, 
            asset_owner=form.asset_owner.data) 

Ich glaube, Sie es durch die Angabe, welches Feld auf dem Model_New_Users beheben können Sie weitergeben möchten. Etwas wie form.asset_owner.data.owner_name oder was auch immer.

0

Der Grund, warum Sie eine Instanz zurück, weil Sie keine

def __str__():

Darstellung gegeben haben. Hoffe, dass diese Hilfe Anfänger wie ich sind.

Verwandte Themen