2015-07-20 93 views
1

我在尝试更新具有以下的关系的记录时有点麻烦:上wtform更新SQLAlchemy的记录提交

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. 

回答

7

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) 
+0

感谢您的评论,我会明天再检查并告诉您结果。 – Prisoner

+0

我知道这是一个简单的解决方案,只是想非常感谢你。完美工作。我曾以为我试过这个,但它没有奏效,所以它会花费我很多时间去尝试一次。 – Prisoner

+0

完美适合我。谢谢。 – user1501382