【问题标题】:Convert variable into class variable (no idea what to name it)将变量转换为类变量(不知道如何命名)
【发布时间】:2011-07-17 15:20:35
【问题描述】:

使用

  • 烧瓶
  • Flask-sqlalchemy
  • 炼金术
  • jQuery
  • 数据表(jquery 插件)
  • Jeditable(jquery 插件)

考虑这个用户类(直接来自 flask-sqlalchemy 文档):

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

数据表发出 ajax 请求并填充表。然后每个 td 都可以使用 jeditable 就地编辑。一旦修改了 td,jeditable 就会向 localhost/modify 发出 POST 请求,其中包含:

  • 行ID(与用户类相同的ID)
  • 新的修改值
  • 被更改的表的列(为了论证,我们假设有三列 id/username/email)(int)

现在,我希望在处理 localhost/modify 的函数中获取行 ID,创建一个用户对象并查询该特定行的数据库,查看需要修改的属性,使用新的价值并提交到数据库。到目前为止,这是我得到的:

@app.route('/modify', methods=['GET', 'POST'])
def modify()
    if request.method == 'POST' :
        user = user.query.get(form.row_id)
        if form.column_id == int(0):
            user.id = form.value
        elif form.column_id == int(1):
            user.username = form.value
        elif form.column_id == int(2):
            user.email = form.value
        else:
            pass
        db.session.commit()
    return 'ok'

这样,是的,它确实有效,但必须有更漂亮的方法。这个好像不是很...pythonic

米海

【问题讨论】:

  • 整数文字周围的int() 毫无意义,让我感到畏缩。

标签: python flask flask-sqlalchemy


【解决方案1】:

使用列 ID 映射到属性名称。

colmap = {
    0: 'id',
    1: 'username',
    2: 'email',
}

@app.route('/modify', methods=['GET', 'POST'])
def modify()
    if request.method == 'POST' :
        user = user.query.get(form.row_id)
        try:
            setattr(user, colmap[form.column_id], form.value)
        except KeyError:
            pass
        db.session.commit()
    return 'ok'

【讨论】:

  • 或者,由于行的索引可能是从 0 到 n-1,所以使用反映行顺序的数组。
  • @Delnan 。 int() 应该绕过 form.column_id。我可能是个新手,但我没那么傻。只是我花了半个小时在我的 ipad 上格式化 amn 问题,在寻找错误时我无法从树上看到森林。
  • @ignacio。这看起来足够优雅。我将把这个问题保持一段时间,因为如果可能的话,我希望看到更多的方法来做到这一点。
  • 显然没有其他人有意见,所以我要关闭它
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 2011-10-31
  • 2011-05-26
  • 2021-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多