2013-02-23 75 views
0

我想遍歷字典和實體。在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 

我的想法是,不管多鑰匙如何在字典中,只有符合性質的那些將被分配和所有其他被忽略。使用上面的代碼,這是有效的。

但是有沒有辦法做到這一點,仍然有驗證發生?

+0

您應該考慮使用Model.properties()調用甚至可以在模型中定義的,而屬性的列表而不是假設你的字典中的任何內容實際上都是模型中的一個真實屬性。理論上你可以有一個與實例中的其他事物相匹配的名稱。 – 2013-02-24 00:35:42

回答

0

您需要使用和戳成__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

相關問題