从 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.param1
、values.param2
等访问各个值。我更喜欢自定义模型 class,但这应该可以完成工作。
我正在使用 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.param1
、values.param2
等访问各个值。我更喜欢自定义模型 class,但这应该可以完成工作。