【问题标题】:Get data values from QuerySelectField with query_factory使用 query_factory 从 QuerySelectField 获取数据值
【发布时间】:2017-05-14 17:57:36
【问题描述】:

我无法使用 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)中检索到实际数据?

感谢您的帮助/帮助!

【问题讨论】:

    标签: python flask-sqlalchemy wtforms


    【解决方案1】:

    你得到一个实例的原因是因为你没有给出一个

    def __str__():

    表示。希望对像我这样的新手有所帮助。

    【讨论】:

      【解决方案2】:

      问题在于您提供了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 之类的东西。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2020-02-21
        • 1970-01-01
        • 2016-08-19
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        相关资源
        最近更新 更多