【问题标题】:Read embedded entity from python ndb client从 python ndb 客户端读取嵌入式实体
【发布时间】:2018-05-10 06:14:27
【问题描述】:

我正在使用谷歌云数据存储 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 为无。所有其他属性值都存在。

这可能是什么问题?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这有点猜测,但由于数据存储属性是由它们的名称(在本例中为 values“字段类型/类”的名称(即StructuredProperty),这可能会解决您的问题:

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

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

      【讨论】:

      • 让我试一试。会让你知道。谢谢!
      • @sshntt 您能否确认此解决方案是否解决了您的问题。
      • 抱歉延迟回复,但到目前为止,我还没有时间实施上述解决方案。在上述情况下,目前,我删除了 DataValues 实体并将其属性添加为 MyEntity 的属性。我将尝试在另一个项目中实施上述解决方案并在此处回复。如果有人在我之前尝试过,请在这里告诉我,以便我接受解决方案。再次抱歉耽搁了。
      • @sshntt 你能把你的解决方案写成答案吗?
      【解决方案3】:

      我遇到了同样的问题,想将嵌入式实体转换为 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 等访问各个值。我更喜欢自定义模型类,但这应该可以完成工作。

      【讨论】:

        猜你喜欢
        • 2018-04-16
        • 2013-09-24
        • 2020-11-07
        • 2014-12-28
        • 2015-02-22
        • 2017-05-22
        • 2018-09-16
        • 1970-01-01
        • 2016-03-04
        相关资源
        最近更新 更多