我是使用Google App Engine开发网络应用程序的新手。
我想检查数据存储中的实体,这些实体为列表属性设置了空值(db.ListProperty
)。但是,当我尝试根据entity.list
GAE检查任何内容时,会出现错误:
'super' object has no attribute 'list'
。
经过一些搜索后,我在this SO question中看到,为GAE数据存储区实体的列表属性设置空值等同于根本不设置该属性。这解释了我的错误。
所以我需要匹配数据存储区中根本没有设置任何list
属性的实体。查看GAE文档,我仍然没有找到任何允许我检查实体是否具有特定属性集的方法。
注意:我不必使用GQL执行此操作。我可以用GQL检索所有实体,然后用python检查。但是GQL解决方案也没问题。
答案 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