4

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

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

'super' object has no attribute 'list'.

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

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

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

4

3 回答 3

15

我可以想到三种方法来解决这个问题。

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

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

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

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

于 2012-07-16T19:50:46.617 回答
2

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

于 2012-07-17T08:12:30.427 回答
0

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

for q in query:
    try:
        q.someattribute
    except AttributeError:
        setattr(q, 'someattribute', True)  # or whatever operation you need
于 2015-10-07T13:53:51.273 回答