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

Python 检查Google App Engine数据存储实体是否具有特定属性,python,database,google-app-engine,google-cloud-datastore,gql,Python,Database,Google App Engine,Google Cloud Datastore,Gql,我对使用Google App Engine开发web应用程序很陌生 我想检查我的数据存储中是否有为列表属性设置了空值的实体(db.ListProperty)。但是,当我试图对照实体.list检查任何内容时,GAE给出了错误: “超级”对象没有属性“列表” 经过一些搜索,我发现为GAE数据存储实体的list属性设置空值等同于根本不设置该属性。这就解释了我的错误 因此,我需要匹配数据存储中的实体,这些实体根本没有任何list属性集。查看GAE文档,我仍然没有找到任何方法来检查实体是否具有特定的属性集

我对使用Google App Engine开发web应用程序很陌生

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

“超级”对象没有属性“列表”

经过一些搜索,我发现为GAE数据存储实体的list属性设置空值等同于根本不设置该属性。这就解释了我的错误

因此,我需要匹配数据存储中的实体,这些实体根本没有任何
list
属性集。查看GAE文档,我仍然没有找到任何方法来检查实体是否具有特定的属性集


注意:我不必用GQL来做这件事。我可以用GQL检索所有实体,然后用python检查。但是GQL解决方案也很好。

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

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

否则,可以使用python hasattr函数

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

第三,您可以使用异常处理程序捕捉错误案例。

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

@dragonx编写的内容完全正确。根据我的经验,最好使用try-except语句:

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

你能张贴你的模型吗?此外,根据文档的定义,ListProperty的值不能为None。但是,它可以是一个空列表。如果未为默认参数指定任何值(或未指定默认参数),则属性的默认值为空列表。'我尝试了它,但它确实将listproperty值创建为[]。另一方面,您无法查询列表是否相等,因此唯一的解决方案是查询所有元素并在python中过滤它们。是的,空值指的是空列表。我希望您在实体中有一个空的“list”元素。我真的不明白为什么你根本没有列表元素,除非实体最初是由一个没有列表元素的模型创建的。如果你按照我问题中的链接,你会看到一个空的列表元素根本没有存储在gae数据存储中,即使模型有一个列表元素,因为实体的存储方式。这就像根本不设置任何属性一样好。+1。我的情况不是1,真的。解决方案2听起来不错。我会尝试一下,希望如果成功,我会接受答案。