我有一个ORM映射对象,我想要更新。我在字典中验证并保护了所有属性(关键字参数)。现在我想更新字典中的所有对象属性。
for k,v in kw.items():
setattr(myobject, k, v)
不起作用(AttributeError Exception),从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'
答案 0 :(得分:3)
您正在尝试将unicode字符串分配给关系属性。说你有:
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")
答案 1 :(得分:2)
myobject.__dict__.update(**kw)