具有动态种类的GAE NDB Expando模型

时间:2016-09-07 15:18:49

标签: python google-app-engine google-cloud-datastore app-engine-ndb

是否可以为Expando模型分配动态实体种类?例如,我想将此模型用于许多类型的动态实体:

class Dynamic(ndb.Expando):
    """
    Handles all "Post types", such as Pages, Posts, Users, Products, etc...
    """
    col = ndb.StringProperty()
    parent = ndb.IntegerProperty()
    name = ndb.StringProperty()
    slug = ndb.StringProperty()

现在我使用“col”StringProperty来保存Kind(如“Pages”,“Posts”等)并每次查询“col”。

阅读完文档后,我偶然发现了这个@classmethod:

class MyModel(ndb.Model):
    @classmethod
    def _get_kind(cls):
         return 'AnotherKind'

这是否意味着我可以这样做?

class Dynamic(ndb.Expando):
    """
    Handles all "Post types", such as Pages, Posts, Users, Products, etc...
    """
    col = ndb.StringProperty()
    parent = ndb.IntegerProperty()
    name = ndb.StringProperty()
    slug = ndb.StringProperty()

    @classmethod
    def _get_kind(cls):
        return 'AnotherKind'

但是如何动态替换'AnotherKind'?我可以做return col之类的事情吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我不知道你是否可以这样做,但这听起来很危险,GAE更新可能会破坏你的代码。

使用子类似乎是一种更安全的替代方案。像这样:

class Dynamic(ndb.Expando):
    parent = ndb.IntegerProperty()
    name = ndb.StringProperty()
    slug = ndb.StringProperty()

class Pages(Dynamic):
    pass

class Posts(Dynamic):
    pass

class Users(Dynamic):
    pass

您也可以尝试使用PolyModel

我们需要更多地了解您的应用程序以及您要完成的任务以提供更具体的建议。