【问题标题】:how can i use a string to to represent an sqlalchemy object attribute?如何使用字符串来表示 sqlalchemy 对象属性?
【发布时间】:2016-09-19 01:50:06
【问题描述】:

我正在使用 SQLalchemy 和 WTForms 编写一个 Flask 应用程序。

数据库更新出现问题...我要更新许多对象表字段。

所以我从这个开始......

# this works great but needs many lines of code
event.evt_num = form.evt_num.data
event.evt_name = form.evt_name.data
event.evt_location = form.evt_location.data
event.evt_address = form.evt_address.data
event.evt_city = form.evt_city.data
event.evt_state = form.evt_state.data
...

虽然上面的 sn-p 有效,但实际上它是巨大的。所以我想变得更聪明,并通过属性迭代来更新数据库。所以我尝试了以下...

event_fields = ('evt_num', 'evt_name', 'evt_location', 'evt_address',
                    'evt_city', 'evt_state', 'evt_zip', 'evt_notes')

for aa in event_fields:
    print "form data", getattr(form, aa).data  # prints posted form data
    print "db data", getattr(event, aa) # prints posted data from database

    if getattr(form, aa).data != getattr(event, aa):  # if form data shows a change
        setattr(event, aa, getattr(form, aa).data)    # update database does not work
        db_change = True
        session.flush()
        ...

此行无法更新数据库:

setattr(event, aa, getattr(form, aa).data)

我收到此错误“AttributeError: 'Event' object has no attribute 'aa'

我们将不胜感激。

【问题讨论】:

  • 如果将getattr() 调用的结果存储在一些变量中会怎样?这样,您就不会反复拨打这些电话。如果event一开始有这个属性,后来突然没有了,你是不是在使用getattr()函数的时候把它从对象中清除了?如果是这样,将结果存储在变量中也应该可以解决该问题。
  • 谢谢。我尝试从 setattr() 函数中删除 getattr(form, aa).data 并将其存储到一个临时变量中,它解决了这个问题。非常感谢!

标签: python python-2.7 flask-sqlalchemy flask-wtforms


【解决方案1】:

如果你这样重组呢?

event_fields = ('evt_num', 'evt_name', 'evt_location', 'evt_address',
            'evt_city', 'evt_state', 'evt_zip', 'evt_notes')

for aa in event_fields:
    form_data = getattr(form, aa).data
    db_data = getattr(event,aa)
    print "form data", form_data  # prints posted form data
    print "db data", db_data # prints posted data from database

    if form_data != db_data:  # if form data shows a change
        setattr(event, aa, form_data)    # update database now works
        db_change = True
        session.flush()
        ...

这样,您可以减少对getattr() 的调用,并且可能会稍微优化您的代码。

【讨论】:

    【解决方案2】:

    根据用户:coralv 的评论,我通过将 getattr 内容存储到变量中而不是将其作为 setattr 函数的一部分来解决问题。代码最终是这样的......

    event_fields = ('evt_num', 'evt_name', 'evt_location', 'evt_address',
                    'evt_city', 'evt_state', 'evt_zip', 'evt_notes')
    
    for aa in event_fields:
        print "form data", getattr(form, aa).data  # prints posted form data
        print "db data", getattr(event, aa) # prints posted data from database
        if getattr(form, aa).data != getattr(event, aa):  # if form data shows a change
            val = getattr(form, aa).data
            setattr(event, aa, val)    # update database now works
            db_change = True
            session.flush()
            ...
    

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2019-08-25
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2014-12-21
      • 2019-08-28
      相关资源
      最近更新 更多