Как ссылаться на элементы объекта Python эликсир - PullRequest
0 голосов
/ 08 июня 2011

Я пытаюсь заменить имя ключа на 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)

1 Ответ

0 голосов
/ 08 июня 2011

К сожалению, вы не можете просто установить атрибут объекта 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 может не понравиться пытаться установить значение несуществующего поля базы данных.

...