如何迭代字典并将每个键的值分配给另一个对象中的匹配属性?
问题描述:
我想遍历字典和实体。在dict键匹配实体属性的情况下,我想将键值指定为属性的值。如何迭代字典并将每个键的值分配给另一个对象中的匹配属性?
我的模型代码是:
class myModel(db.Model):
Property1 = db.IntegerProperty()
Property2 = db.StringProperty(required=True,choices=set(["this", "that", "other"]))
Property3 = db.StringProperty()
我的字典是:
{u'Property1': u'1234', u'Property2': u'trouble', u'Property3': u'2321'}
,我使用过两个对象进行迭代的代码工作,但它是跳跃在模型验证。如果我明确指定myModel.Property2 = 'trouble'
,我收到一个BadValueError。但是,在下面的代码中,我没有。
for le_attr, le_value in myModel.__dict__.iteritems():
for key, value in Data[0].items():
if ('_' + str(key)) == (str(le_attr)):
myModel.__dict__[le_attr]= value
我的想法是,不管多钥匙如何在字典中,只有符合性质的那些将被分配和所有其他被忽略。使用上面的代码,这是有效的。
但是有没有办法做到这一点,仍然有验证发生?
答
您需要使用和戳成__dict__
结构dir()
setattr()
functions代替:
for le_attr in dir(myModel)
if le_attr in Data[0]:
setattr(myModel, le_attr, Data[0][le_attr])
+0
谢谢!这工作!昨天晚上我正在和setattr打交道,但无法得到它。这个例子清除了它。 – 2013-02-23 18:58:59
您应该考虑使用Model.properties()调用甚至可以在模型中定义的,而属性的列表而不是假设你的字典中的任何内容实际上都是模型中的一个真实属性。理论上你可以有一个与实例中的其他事物相匹配的名称。 – 2013-02-24 00:35:42