Как можно массово назначить атрибуты объекта SA ORM? - PullRequest
1 голос
/ 26 августа 2009

У меня есть сопоставленный объект ORM, который я хочу обновить. У меня есть все атрибуты проверены и защищены в словаре (ключевые слова аргументы). Теперь я хотел бы обновить все атрибуты объекта, как в словаре.

for k,v in kw.items():
    setattr(myobject, k, v)

не работает (исключение AttributeError), выбрасывается из SQLAlchemy.

myobject.attr1 = kw['attr1']
myobject.attr2 = kw['attr2']
myobject.attr3 = kw['attr3']

и т. Д. Это ужасный код копировать-вставить, я хочу этого избежать. #

Как мне этого добиться? SQLAlchemy уже делает что-то похожее на то, что я хочу сделать в их конструкторах (myobject = MyClass (** kw)), но я не могу найти этого во всех запутанных дерьме метапрограммирования.

ошибка от SA:

<<          if self.trackparent:
                   if value is not None:
                       self.sethasparent(instance_state(value), True)
                   if previous is not value and previous is not None:
                       self.sethasparent(instance_state(previous), False)
>>  self.sethasparent(instance_state(value), True)
AttributeError: 'unicode' object has no attribute '_sa_instance_state'

Ответы [ 2 ]

3 голосов
/ 26 августа 2009

Вы пытаетесь присвоить строку юникода атрибуту отношения. Скажем, у вас есть:

 class ClassA(Base):
     ...
     b_id = Column(None, ForeignKey('b.id'))
     b = relation(ClassB)

И вы пытаетесь сделать:

 my_object = ClassA()
 my_object.b = "foo"

Когда вы должны делать либо:

 my_object.b_id = "foo"
 # or
 my_object.b = session.query(ClassB).get("foo")
2 голосов
/ 26 августа 2009
myobject.__dict__.update(**kw)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...