python - 在 wtform 提交上更新 SQLAlchemy 记录

标签 python flask sqlalchemy wtforms

我在尝试更新具有以下关系的记录时遇到了一些麻烦:

events_mentor_table = db.Table('events_mentors', db.Model.metadata,
    db.Column('event_id', db.Integer, ForeignKey('event.id')),
    db.Column('mentor_id', db.Integer, ForeignKey('mentor.id'))
)

class Mentor(db.Model):
    __tablename__ = 'mentor'
    id = db.Column(db.Integer(), primary_key=True)
    first_name = db.Column(db.String())
    last_name = db.Column(db.String())
    job_title = db.Column(db.String())
    company_url = db.Column(db.String())
    twitter_url = db.Column(db.String())
    linkedin_url = db.Column(db.String())
    bio = db.Column(db.Text())

    def __str__(self):
        return '%s %s (%s)' % (self.first_name, self.last_name, self.job_title)


class Event(db.Model):
    __tablename__ = 'event'
    id = db.Column(db.Integer(), primary_key=True)
    date = db.Column(db.Date())
    start_time = db.Column(db.Time())
    end_time = db.Column(db.Time())
    title = db.Column(db.String())
    address = db.Column(db.String())
    description = db.Column(db.Text())
    mentors = relationship('Mentor', secondary=events_mentor_table)

当创建一个新条目时,我简单地做:

@admin_events.route('/admin/events/create/', methods=['GET', 'POST'])
@login_required
def create_new():
    form = EventForm()
    if form.validate_on_submit():
        event = Event(**form.data)
        db.session.add(event)
        db.session.commit()
        flash('successfully added new event', 'success')
    return render_template('admin/events_create_new.html', form=form)

哪个工作正常。编辑它时我使用以下内容:

@admin_events.route('/admin/events/<int:event_id>/', methods=['GET', 'POST'])
@login_required
def edit(event_id):
    event = Event.query.filter_by(id=event_id)
    form = EventForm(obj=event.one())
    if form.validate_on_submit():
        event.update(dict(**form.data))
        db.session.commit()
        flash("info updated", "success")
    return render_template('admin/events_edit.html', event=event.one(), form=form)

但问题是我收到一条错误消息:

ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'Mentor'
[SQL: 'UPDATE event SET id = event_id AND id = mentor_id=%(param_1)s, date=%(date)s, start_time=%(start_time)s, end_time=%(end_time)s, title=%(title)s, address=%(address)s, description=%(description)s WHERE event.id = %(id_1)s'] [parameters: {'description': u'9', 'title': u'9', 'start_time': datetime.time(11, 11), 'param_1': [<app.models.Mentor object at 0x7f4227a6bf10>], 'id_1': 12, 'end_time': datetime.time(11, 11), 'address': u'9', 'date': datetime.date(2015, 7, 9)}]

我已经摆弄了一段时间,但似乎无法弄清楚解决方案到底是什么。我很确定我可以清除 mentor 数组,从表单数据中删除 form.data.mentors 然后手动循环并提交,例如:

mentors = form.data.mentors
del form.data.mentors
event.update(dict(**form.data))
event.mentors = mentors # this doesn't actually work, but I'm sure I could probably get it to work if I wanted to pursue this nasty solution.

最佳答案

WTForms 提供了一个 method called populate_obj正是为了这个目的。

@login_required
def edit(event_id):
    event = Event.query.filter_by(id=event_id).one()
    form = EventForm(obj=event)
    if form.validate_on_submit():
        form.populate_obj(event)
        db.session.commit()
        flash("info updated", "success")
    return render_template('admin/events_edit.html', event=event.one(), form=form)

关于python - 在 wtform 提交上更新 SQLAlchemy 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521662/

相关文章:

python - 使用其自身的简化副本对复杂列表进行重复数据删除

python - 在python中处理包含标点编码的数据文件中的字符串

flask - 带create_app,SQLAlchemy和Celery的 flask

python - 无法使用pycharm调试 flask 应用程序

python - Flask:request.form.getlist不会返回任何条目

python - 添加到列表中的项目未按预期顺序排列

python - 如何在 Python 中为 Postgres 自动生成 UUID?

python - 通过无类型数组进行迭代

python - Pandas 从一个数据框中删除另一个数据框中的所有元素

sqlalchemy - sqlalchemy中多列的唯一约束