0

我正在尝试从request.paramElixir 对象属性中交换键名。下面,Elixir 对象bk是一个Book()具有属性的PrintTitlePrintTitle也来自作为 a 的形式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)
4

1 回答 1

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

于 2011-06-08T19:34:30.047 回答