【问题标题】:SQLAlchemy error - TypeError: add_all() takes exactly 2 arguments (6 given)SQLAlchemy 错误 - TypeError: add_all() 只需要 2 个参数(给定 6 个)
【发布时间】:2014-02-11 11:23:26
【问题描述】:

我在下面收到此错误,有人可以帮忙吗?如果这还不够信息,请告诉我。我有一个forms.py,addcontact模板,下面来自app.py。

反馈错误:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
   reraise(exc_type, exc_value, tb)
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
   response = self.full_dispatch_request()
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
   rv = self.handle_user_exception(e)
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
   reraise(exc_type, exc_value, tb)
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
   rv = self.dispatch_request()
 File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
   return self.view_functions[rule.endpoint](**req.view_args)
 File "/home/rob/webappan2/addressbook/app.py", line 63, in contact_add
,[request.form['mobile']],[request.form['work_location']])
 File "/usr/share/pyshared/sqlalchemy/orm/scoping.py", line 113, in do
   return getattr(self.registry(), name)(*args, **kwargs)
TypeError: add_all() takes exactly 2 arguments (6 given)

我的方法

@app.route('/addcontact/', methods=['GET','POST'])
def contact_add():
    form = ContactsForm()
    if request.method == 'POST':
        if form.validate() == False:
            flash('All fields are required.')
        else:
            db.session.add_all(request.form['surname'],request.form['firstname'],request.form['email']\
                        ,request.form['mobile'],request.form['work_location'])
            db.session.commit()
            flash("Contact added successfully.")
            return redirect(url_for("contact_list"))
    elif request.method == 'GET':
        return render_template('addcontact.html', title = 'Add Contact',form = form)

这是我的联系方式:

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    surname = db.Column(db.String(100))
    firstname = db.Column(db.String(100))
    email = db.Column(db.String(100))
    mobile = db.Column(db.String(20))
    work_location = db.Column(db.String(100))
    #user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __init__(self,surname,firstname,email,mobile,work_location):
        self.surname =  surname
        self.firstname = firstname
        self.email = email
        self.mobile = mobile
        self.work_location = work_location

    def __repr__(self):
        return '<Post %r>' % (self.surname)

如果我的联系表:

class ContactsForm(Form):
    surname = fields.TextField(validators=[validators.required()])
    firstname = fields.TextField(validators=[validators.required()])
    email = fields.TextField(validators=[validators.required()])
    mobile = fields.TextField(validators=[validators.required()])
    work_location = fields.TextField(validators=[validators.required()])

【问题讨论】:

  • 你有Contact 模特吗?
  • session.add_all() 采用模型实例,而不是普通字段,并作为 一个列表。大概ContactsForm 与该模型相关联?
  • 我已经添加了我的联系方式和表格
  • 如果我做了contacts = [request.form['surname'],request.form['firstname'],request.form['email'],request.form['mobile'], request.form['work_location']]
  • 然后 session.add_all(contacts) 出现另一个错误

标签: python sqlalchemy flask flask-wtforms


【解决方案1】:

不要将表单字段值添加到会话中; SQLAlchemy 不知道您要在此处添加什么对象。

相反,创建一个新的 Contact 对象并将 that 添加到会话中:

if request.method == 'POST':
    if form.validate() == False:
        flash('All fields are required.')
    else:
        contact = Contact(form.data['surname'], form.data['firstname'],
                          form.data['email'], form.data['mobile'], 
                          form.data['work_location'])
        db.session.add(contact)
        db.session.commit()
        flash("Contact added successfully.")
        return redirect(url_for("contact_list"))

您还可以从您的 Contact 模型中完全删除 __init__ 方法(无论如何,SQLAlchemy 都会为您创建一个,使用关键字参数而不是必需的位置参数):

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    surname = db.Column(db.String(100))
    firstname = db.Column(db.String(100))
    email = db.Column(db.String(100))
    mobile = db.Column(db.String(20))
    work_location = db.Column(db.String(100))
    #user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Contact %r>' % (self.surname)

并使用Form.populate_obj() function 省去输入所有这些字段的麻烦。

if request.method == 'POST':
    if form.validate() == False:
        flash('All fields are required.')
    else:
        contact = Contact()
        form.populate_obj(contact)
        db.session.add(contact)
        db.session.commit()
        flash("Contact added successfully.")
        return redirect(url_for("contact_list"))

甚至:

    else:
        contact = Contact(**form.data)
        db.session.add(contact)

【讨论】:

  • +1 哇,你的明星!你以前帮过我几次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2017-07-19
相关资源
最近更新 更多