从 python ndb 客户端读取嵌入式实体

Read embedded entity from python ndb client

我正在使用 google 云数据存储 python 客户端将实体写入包含嵌入式实体的数据存储。示例实体可能如下所示:

data_type: 1
raw_bytes: <unindexed blob>
values: <indexed embedded entity>

我检查了来自控制台的数据,数据保存正确并且值存在。

接下来,我需要 运行 来自 python 应用引擎应用程序的查询。我在我的应用引擎代码中将以上内容表示为以下实体:

class DataValues(ndb.Model):
    param1 = ndb.BooleanProperty()
    param2 = ndb.IntegerProperty()
    param3 = ndb.IntegerProperty()

class MyEntity(ndb.Expando):
    data_type = ndb.IntegerProperty(required=True)
    raw_bytes = ndb.BlobProperty()
    values = ndb.StructuredProperty(DataValues)        

查询中的一个过滤器取决于 values 中的 属性。示例查询代码如下:

MyEntity.query().filter(MyEntity.data_type == 1).filter(MyEntity.values.param1 == True).get()

我已经在我的 index.yaml 中创建了相应的复合索引 查询 运行 成功,但生成的实体包含嵌入实体 values 作为 None。所有其他 属性 值都存在。

这里可能是什么问题?

这是一个猜测,但由于数据存储属性在某种程度上是由它们的名称(在本例中为 values "field type/class"(即 StructuredProperty),这可能会解决您的问题:

class EmbeddedProperty(ndb.StructuredProperty):
    pass

class MyEntity(ndb.Expando):
    data_type = ndb.IntegerProperty(required=True)
    raw_bytes = ndb.BlobProperty()
    values = EmbeddedProperty(DataValues) 

试一试,如果 values 开始返回非空值,请告诉我。

DataValues 实体的属性添加为 MyEntity 的属性。

我遇到了同样的问题,想将嵌入式实体转换为 Python 字典。一种可能的解决方案,尽管不是一个非常优雅的解决方案,是使用 GenericProperty:

class MyEntity(ndb.Model):
    data_type = ndb.IntegerProperty(required=True)
    raw_bytes = ndb.BlobProperty()
    values = ndb.GenericProperty()

values 将被读取为 "Expando" 对象:Expando(param1=False,...)。您可以使用 values.param1values.param2 等访问各个值。我更喜欢自定义模型 class,但这应该可以完成工作。