0

request.paramElixir オブジェクト属性のキー名を a からスワップしようとしています。以下では、 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)
4

1 に答える 1

0

残念ながら、この方法で変数を使用して Python オブジェクトの属性を設定することはできません。これを行う 1 つの方法は、メソッドを使用してこれ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

編集: elixer/sqlalchemy が存在しない値を設定しようとするのを好まない可能性があるため、params のキーが最初に db モデルに存在することを確認する必要があるという点で、setattr の使用に注意する必要があることを追加する必要があります。データベース フィールド。

于 2011-06-08T19:34:30.047 に答える