【发布时间】:2018-10-08 17:28:53
【问题描述】:
当 ndb.Model 中的 required 选项放置在指定为 StructuredProperty 中的结构的模型中时,我遇到了问题。
这是模型定义:
class SubModel(ndb.Model):
submodel_id = ndb.StringProperty(required=True)
class MyModel(ndb.Model):
model_id = ndb.StringProperty(required = True)
submodels = ndb.StructuredProperty(SubModel, repeated=True)
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
if 'submodels' in kwargs.keys():
_submodels = []
for kwarg in kwargs['submodels']:
if isinstance(kwarg, SubModel):
_submodels.append(kwarg)
else:
t = SubModel(**kwarg)
_submodels.append(t)
self.submodels = _submodels
我想要做的是要么创建一个没有子模型的模型,要么创建一个模型,其中每个子模型都有一个必需的 id,否则会引发错误。
所以当我测试这个模型时,我得到了这些结果:
args1 = {"model_id":"some_id","submodels":[{"submodel_id":null}]}
model1 = MyModel(**args1)
model1.put()
print model1.key.id()
# Everything works while submodel_id hasn't been set and it returns the key id from Google Datastore
args2 = {"model_id":null,"submodels":[{"submodel_id":"some_id"}]}
model2 = MyModel(**args2)
model2.put()
print model2.key.id()
# Google Datastore raises an error : Entity has uninitialized properties: model_id
这种行为是来自 ndb.StructuredProperty 的标准行为(意味着不考虑指定结构中的属性选项)还是我应该以不同的方式实现我想要做的事情?
我还想做的是让 Submodel 继承自 ndb.Expando 而不是 ndb.Model 但由于 ndb.Expando 继承自 ndb.Model,这将是一个更精确的问题...
【问题讨论】:
标签: python google-app-engine app-engine-ndb