[英]Inheritance and entity list in NDB Google App Engine
我正在尋找存儲具有相同父代的不同種類的實體的列表的最佳方法。 我想出了以下幾點:
class Action(ndb.Model):
date = ndb.DateTimeProperty(auto_now_add = True)
class ContentAction(Action):
content = ndb.StringProperty()
class AuthoredAction(Action):
author = ndb.StringProperty()
class ActionContainer(ndb.Model):
actions = ndb.StructuredProperty(Action, repeated=True, indexed=False)
不幸的是,一旦我將兩個不同類型的實體添加到動作列表中,就無法分辨該實體是哪種類型(它們都是動作)。
同樣,與第一個添加的實體相比,屬於不同類的實體的繼承屬性似乎也會丟失。 例如,在添加ContentAction然后添加AuthoredAction之后,后一個對象是沒有'author'屬性的Action。 也許StructuredProperty僅允許存儲相同類型的對象? 有沒有更好的方法來構造這個?
從文檔 :
回讀這樣的[結構化]實體可以准確地重建原始的Contact實體。 盡管使用與模型類相同的語法定義了地址實例,但它們不是完整的實體。 他們在數據存儲區中沒有自己的密鑰。 不能獨立於它們所屬的Contact實體來檢索它們。
因此,當您閱讀actions
列表中的項目時,應用引擎會根據存儲在其中的數據創建一個類型為Action
的實體。 因此,為什么所有它們看起來都像是Action
才有意義。
作為使用Polymodel
的替代方法(我不喜歡並避免),可以使用常規的Python類或帶有ndb的Pickle Property
Python namedtuple,如下所示:
ContentAction = namedtuple('ContentAction', ['date', 'content'])
AuthoredAction = namedtuple('AuthoredAction', ['date', 'author'])
class ActionContainer(ndb.Model):
actions = ndb.PickleProperty(repeated=True)
然后,您可以在操作列表中放入任何您喜歡的命名元組。
如果這對您不起作用,那么您可以使用KeyProperty,如對其他答案的注釋中所示。
我覺得這不是一個很好的存儲策略。 如果您正在尋找屬性的繼承,那么您所追求的就是PolyModel 。
此處提供一些示例: https : //cloud.google.com/appengine/articles/polymodel?hl=zh_CN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.