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

时间:2018-10-22 11:06:19

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

我目前在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()]

现在,让我们说,我又添加了一个名为property的{​​{1}}。例如,

market_id

这里的问题是,对于所有现有实体,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的额外列)。

由于我正在处理Python类属性,因此我假定不需要迁移。但是,名为roles的列如何已经存在?为什么不添加名为roles的新属性?是否需要迁移?

1 个答案:

答案 0 :(得分:3)

您建议的更改不是实际的ndb模型更改,因为您没有添加/删除/修改模型的任何数据存储属性。当实体将put()放入数据存储区时,只有ndb.Property类孩子是 real ndb模型属性。

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

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

我相信,对问题的更新使这一点更加清楚。 market_id @property不是User数据存储区实体属性。要为其获取值,您无需更新User实体,但是必须创建/编辑具有其UserRole属性指向resource的相应Market实体实体。