如何在ndb模型中迁移新添加的python class 属性?

How to migrate newly added python class property in ndb model?

我目前在 NDB 中有一个模型,我想向其中添加一个新的 属性。假设我有以下内容:

class User(Model, BaseModel):
    name = ndb.StringProperty(required=False)
    email = ndb.StringProperty(required=False)

    @property
    def user_roles(self):
        return UserRole.query(ancestor=self.key).fetch()

    @property
    def roles(self):
        return [user_role.role for user_role in UserRole.query(ancestor=self.key).fetch()]

现在,比方说,我又添加了一个名为 market_idproperty。例如,

class User(Model, BaseModel):
    name = ndb.StringProperty(required=False)
    email = ndb.StringProperty(required=False)

    @property
    def user_roles(self):
        return UserRole.query(ancestor=self.key).fetch()

    @property
    def roles(self):
        return [user_role.role for user_role in UserRole.query(ancestor=self.key).fetch()]

    @property
    def market_id(self):
        """ fetches `id` for the resource `market` associated with `user` """
        for each_role in UserRole.query(ancestor=self.key):
            resource = each_role.role.get().resource
            if resource.kind() == 'Market':
                return resource.id()

        return None

这里的问题是,roles 已按预期正确获取所有现有实体(因为 属性 从一开始就存在,而且可以在数据存储中观察到一个额外的列称为 roles).

由于我正在处理 Python class 属性,因此我认为不需要迁移。但是,名为 roles 的列怎么已经存在了?为什么新添加的 属性 不叫 market_id?是否需要迁移?

您建议的更改不是实际的 ndb 模型更改,因为您没有 adding/deleting/modifying 模型的任何数据存储属性。只有 ndb.Property class children 是 真实的 ndb 实体在 put() 到数据存储区时存储的模型属性。

您要添加的 属性 是 Python class @属性 - 与数据存储中的内容无关。

因此对于这种特殊情况,不需要迁移。

我相信问题的更新使这一点更加清楚。 market_id @属性 不是 User 数据存储实体 属性。要获取它的值,您不需要更新 User 实体,但您必须 create/edit 相应的 UserRole 实体及其 resource 属性 指向一个 Market 实体。