我目前在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
的新属性?是否需要迁移?
答案 0 :(得分:3)
您建议的更改不是实际的ndb
模型更改,因为您没有添加/删除/修改模型的任何数据存储属性。当实体将put()放入数据存储区时,只有ndb.Property
类孩子是 real ndb
模型属性。
您要添加的属性是Python类@property-与数据存储区中的内容无关。
因此对于这种特殊情况,不需要迁移。
我相信,对问题的更新使这一点更加清楚。 market_id
@property不是User
数据存储区实体属性。要为其获取值,您无需更新User
实体,但是必须创建/编辑具有其UserRole
属性指向resource
的相应Market
实体实体。