Google NDB-StructuredProperty结构内的必需属性未按预期工作

时间:2018-10-08 17:28:54

标签: python google-app-engine app-engine-ndb

当将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继承,所以这将是一个更精确的问题...

1 个答案:

答案 0 :(得分:0)

“ model_id”上有required = True。您正在尝试put()而不定义一个实体(null不计算在内)。

您的put()MyModel上。不知道为什么在父模型上使用submodel_id时没有检查SubModel中的putting要求。似乎应该检查它。您可以检查数据存储区并查看实际put()是什么吗?当您读回该实体时,您会得到什么?