当将ndb.Model的必需选项放在指定为来自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继承,所以这将是一个更精确的问题...
答案 0 :(得分:0)
“ model_id”上有required = True
。您正在尝试put()
而不定义一个实体(null
不计算在内)。
您的put()
在MyModel
上。不知道为什么在父模型上使用submodel_id
时没有检查SubModel
中的putting
要求。似乎应该检查它。您可以检查数据存储区并查看实际put()
是什么吗?当您读回该实体时,您会得到什么?