1

我有以下模型:

class Employee (Base):
    __tablename__ = 'employees'

    id       = Column(Integer, primary_key=True, autoincrement=True)
    name     = Column(String(300), unique=True, nullable=False)
    phone_a  = Column(String(20), nullable=False)
    phone_b  = Column(String(20))
    email_a  = Column(String(400), nullable=False)
    email_b  = Column(String(400))
    address  = Column(String)
    charge   = Column(String(100), nullable=False)
    active   = Column(Boolean, default=True)

    created  = Column(DateTime, nullable=False, default=datetime.datetime.now)
    modified = Column(DateTime, onupdate=datetime.datetime.now)

    def __init__(self):
        self.active  = True
        self.created = datetime.datetime.now()

    def __unicode__(self):
        return self.name

我为它编写了添加视图,非常基本:

employee = Employee()
form     = Form(request, EmployeeSchema(), obj = employee)

if form.validate():
    employee = form.bind(Employee())
    try:
        DBSession.add(employee)
        DBSession.flush()
        return HTTPFound(location = request.route_url('employees'))
    except IntegrityError:
        message = 'Oops!'

而且效果很好。但 UPDATE 视图没有。我只是不保存。根据教程,基本上使用相同的代码它应该可以工作。但它没有,SQLAlchemy 尝试插入一个新对象,而不是仅仅更新它。我试过

import transaction
transaction.commit()

但没有成功。

_id = request.matchdict['employeeid']
employee = DBSession.query(Employee).filter_by(id=_id).first()
form     = Form(request, EmployeeSchema(), obj = employee)

if form.validate():
    employee    = form.bind(Employee())
    try:
        DBSession.add(employee)
        return HTTPFound(location = request.route_url('employees'))
    except IntegrityError:
        message = ''
4

1 回答 1

4

您需要绑定到项目,不需要添加新Employee()实例:

_id = request.matchdict['employeeid']
employee = DBSession.query(Employee).get(_id)
form     = Form(request, EmployeeSchema(), obj=employee)

if form.validate():
    form.bind(employee)
    return HTTPFound(location = request.route_url('employees'))

就是这样。

于 2013-06-07T21:28:38.270 回答