如何引用Python elixir对象项

时间:2011-06-08 16:14:44

标签: python python-elixir

我正在尝试从request.param交换密钥名称以获取Elixir对象属性。下面,Elixir对象bkBook(),其属性为PrintTitlePrintTitle也来自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)

1 个答案:

答案 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可能不喜欢尝试设置不存在的数据库字段的值。