簡體   English   中英

NDB Google App Engine中的繼承和實體列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM