检查Google App Engine数据存储区实体是否具有特定属性

时间:2012-07-16 19:21:15

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

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

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

'super' object has no attribute 'list'

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

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

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

3 个答案:

答案 0 :(得分:14)

我可以想出三种方法。

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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