2013-07-01 39 views
1

我想通過這種方式通過ReferencePropery獲取實體。通過getattr獲取數據存儲對象而無需知道它的類

getattr(model, refrence) 

其中模型是db.Model和參考是db.ReferenceProperty。但是我得到了一個KindError,我可以通過添加下面的排序來避免這種情況。

from foomodule import ReferedKind 

哪裏ReferedKind是類我想上面getattr獲得由實體。

但我的問題是在我的情況下,因爲我想調用此函數的性質,model可以屬於我的任何Model類。所以我不知道ReferedKind會是什麼。

如何在不導入每個可能的模型類的情況下撥打getattr並獲取被引用的實體?

有沒有一種方法可以提前知道ReferanceProperty所提及的實體的類別,以便我可以動態地導入它?

aditional的信息

我寫會返回一個JSON序列化的Python字典的功能。因爲在某些情況下,由db.to_dict()返回的字典不是json可序列化的。所以這個函數事先並不知道它將不得不放入一個字典中的模型。

回答

1

通常情況下,您需要導入所有可能的模型,您可以在做任何事情之前檢索。

你爲自己努力工作。

你這樣做的唯一方法是在比db.Model或ndb.Model更低的級別上工作以獲取原始數據然後檢查它,然後在引用referenceProperty或獲取引用之前仍然需要導入模型鍵。

如果您決定這樣做ndm會更容易,因爲它沒有引用屬性,但是一個KeyProperty,您可以使用getattr,檢查是否有密鑰,然後獲取被引用的對象是密鑰。

如果你想堅持db。這將是混亂的,因爲你需要使用get_value_for_datastore

將涉及,

獲取類的實體,得到了類的屬性,然後調用get_value_for_datastore傳入實例,然後假設你已經導入了你可以得到鑰匙。

,所以如果你從數據庫中名爲foo有一個實例,你會

prop = getattr(foo.__class__,"the_property_name") 
obj_key = prop.get_value_for_datastore(foo) 

然後,你將需要獲得來自關鍵的那種,然後制定出如何導入模型的那種,你之前獲得()的關鍵,其他明智的你仍然會得到KindError

我不知道所有的努力是值得的,你會發現它更容易導入模型。在使用它之前,您最終需要導入任何模型。你唯一可能獲得的是一個懶惰的導入,可能會節省一些啓動時間。

+0

感謝您的回答。從你的回答中,我意識到ndb模型更容易做到這一點。但是我已經有了現有的db模型,並且轉換到ndb需要一些時間。所以我想我堅持導入一切。現在我可以看到其他解決方法是令人厭煩的。謝謝你的時間。 –

相關問題