【问题标题】:Check if Google App Engine datastore entity has a particular property检查 Google App Engine 数据存储实体是否具有特定属性
【发布时间】:2012-07-16 19:21:14
【问题描述】:

我是使用 Google App Engine 开发网络应用程序的新手。

我想检查我的数据存储中的实体为列表属性设置了空值 (db.ListProperty)。但是,当我尝试对照entity.list GAE 检查任何内容时,会出现错误:

'super' object has no attribute 'list'.

经过一番搜索,我在this SO question 中看到,为 GAE 数据存储实体的列表属性设置一个空值等同于根本不设置该属性。这解释了我的错误。

所以我需要匹配数据存储区中根本没有设置任何list 属性的实体。查看 GAE 文档,我仍然没有找到任何方法可以让我检查实体是否具有特定的属性集。

注意:我不必对 GQL 执行此操作。我可以使用 GQL 检索所有实体,然后使用 python 检查。但是 GQL 解决方案也可以。

【问题讨论】:

  • 你能发布你的模型吗?同样根据文档'ListProperty 的值不能为无。但是,它可以是一个空列表。为默认参数指定 None 时(或未指定默认参数时),属性的默认值为空列表。我试过了,它确实将listproperty值创建为[]。另一方面,您无法查询列表是否相等,因此唯一的解决方案是查询所有元素并在 python 中过滤它们。
  • 是的,空值是指空列表。
  • 我希望实体中有一个空的“列表”元素。我真的不明白为什么你根本没有列表元素,除非实体最初是由没有列表元素的模型创建的。
  • 如果您点击我的问题中的链接,您会看到一个空的列表元素根本没有存储在 gae 数据存储中,即使模型有一个列表元素,因为实体的方式被存储。完全不设置任何属性就好了。

标签: python database google-app-engine google-cloud-datastore gql


【解决方案1】:

我可以想到三种解决方法。

您可能会遇到这种情况,因为最初您的模型没有“列表”属性,而您后来添加了一个,因此数据存储区中可能有没有“列表”属性的较旧实例。您可以编写一个 mapreduce 函数来遍历您的数据存储并确保所有实体都具有“列表”元素。

否则,你可以使用 python hasattr 函数

if hasattr(entity, 'list'):
    a = entity.list[0] # or whatever operation you want

第三,您可以使用异常处理程序来捕获错误情况。

【讨论】:

  • +1。我的情况不是#1,真的。解决方案 2 听起来不错。我会尝试一下,希望如果它有效,我会接受答案。
【解决方案2】:

在 GQL 中无法做到这一点,它只能过滤现有值。相反,您应该使用某种形式的计算属性。 NDB 支持这些,或者您可以覆盖 _pre_put 挂钩以将其他一些属性设置为,例如,列表的长度。这将允许您查询这个新属性 == 0。

【讨论】:

    【解决方案3】:

    @dragonx 写的完全没问题。根据我的经验,最好使用 try-except 语句:

    for q in query:
        try:
            q.someattribute
        except AttributeError:
            setattr(q, 'someattribute', True)  # or whatever operation you need
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2023-03-19
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多