【问题标题】:Google NDB - required property inside StructuredProperty's structure not working as expectedGoogle NDB - StructuredProperty 结构中的必需属性未按预期工作
【发布时间】: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


    【解决方案1】:

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

    您的put()s 位于MyModel。不知道为什么 SubModel 中的 submodel_id 要求在父模型上 putting 时没有被检查。看来应该检查一下。你能检查一下数据存储,看看到底是什么put()吗?当您回读该实体时,您会得到什么?

    【讨论】:

    • 这就是我会得到的。在此屏幕截图中,只有 ID 为“5390493194125312”的实体是不需要的。 Google Datastore screenshot
    • 好的,所以我正在解决Entity has uninitialized properties: model_id 错误。那是因为您试图放置一个没有必需属性的实体。要检查 StructuredProperty 中所需的属性,看起来您必须在放置之前运行自己的检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多