我正在尝试从request.param
交换密钥名称以获取Elixir对象属性。下面,Elixir对象bk
是Book()
,其属性为PrintTitle
。 PrintTitle
也来自request.param
的表单。我不想手动将所有参数映射到Book属性,而是基于简单的if in
映射它们。但是,它不起作用,因为bk.k
处的语法或方法错误。
if len(request.params) != 0:
bk = Book()
for k, v in request.params.items():
print k, v # gives me love
bk.k = v # no love here
print 'Print Title:', bk.PrintTitle # value is None (obviously)
答案 0 :(得分:0)
不幸的是,您不能以这种方式使用变量设置Python对象的属性。一种方法是使用setattr
方法来实现这一点,例如这里有一个粗略的例子:
from elixir import *
metadata.bind = 'sqlite://'
metadata.bind.echo = False
class Book(Entity):
PrintTitle = Field(String(50))
setup_all()
create_all()
params = {'PrintTitle':'Ethyl the Aardvark goes Quantity Surveying'}
bk = Book()
print "Title in database (before): {}".format(bk.PrintTitle)
for k, v in params.items():
setattr(bk, k, v)
print "Title in database (after): {}".format(bk.PrintTitle)
此脚本的结果是:
Title in database (before): None
Title in database (after): Ethyl the Aardvark goes Quantity Surveying
这里我伪造了你的灵丹妙药模型,我只是用params
字典来伪造你在request.params
中得到的任何东西。
因此,在此示例中setattr(bk, k, v)
几乎就是您尝试使用bk.k=v
。
编辑:我应该补充说你需要小心使用setattr,因为你需要确保你的数据库模型中的密钥首先存在,因为elixer / sqlalchemy可能不喜欢尝试设置不存在的数据库字段的值。